C#-返回后,在catch块中重试异常

本文关键字:重试 异常 catch 返回 C#- | 更新日期: 2023-09-27 18:01:04

考虑以下代码:

try{
    ....
} catch(Exception) {
    return null;
    throw;
}

这有意义吗?

通常,如果在返回后放入任何代码,VisualStudio会将其标记为不可访问的代码,但在这种情况下,它不会。这有原因吗?

编辑

作为对这个问题的补充,我想再问一个问题。

如果返回后在finally块中抛出异常,会发生什么?

try{
    ....
} catch(Exception) {
    return null;
} finally {
    throw new Exception();
}

C#-返回后,在catch块中重试异常

return之后的throw永远不会执行。对于调用方,异常不是thrown。这是一个无法访问的代码

这没有任何意义,抛出异常的方法不会向调用方返回任何东西(除了异常本身(。所以就扔吧。

try
{
    // return something valid
} 
catch(Exception) 
{
    throw;
}

至于为什么它没有被Visual Studio标记为不可访问,我认为这是一个错误。

编辑:

如果在finally块中抛出异常,则异常会在堆栈中冒泡以查找catch,并且不会返回值。

return-语句后面放任何代码都毫无意义。它根本无法执行,无论它是一个有效的语句,还是在您的情况下类似的异常。使用return,您将进入执行堆栈而不会返回,因此应用程序无法在单个return语句之后检查代码。

您应该返回特定值抛出异常,否则两者都不起作用。话虽如此,returnthrow语句都将离开当前方法,返回调用方法。

此外还有yield return。这有点不同,因为它的意思是"从迭代器方法返回下一个元素"。

returnthrow都将退出该方法。您的catch块永远不会抛出异常,因为您只能退出一次。因此,throw在这里是不可访问的。但是,如果存在finally块,情况可能会有所不同。请考虑以下代码。

try{
    ....
} 
catch(Exception) {
    return null;
    throw; // unreachable
}
finally
{
    //....
}

即使有任何异常,finally块内的代码也将执行,return null返回值将保持缓存状态,直到最终执行为止。

编辑

如果finally块抛出异常,它将向上传播,并且应该是在更高级别上处理。如果未处理异常,则程序将使崩溃

有关更多信息,您可以点击此链接