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();
}
return
之后的throw
永远不会执行。对于调用方,异常不是thrown
。这是一个无法访问的代码。
这没有任何意义,抛出异常的方法不会向调用方返回任何东西(除了异常本身(。所以就扔吧。
try
{
// return something valid
}
catch(Exception)
{
throw;
}
至于为什么它没有被Visual Studio标记为不可访问,我认为这是一个错误。
编辑:
如果在finally块中抛出异常,则异常会在堆栈中冒泡以查找catch,并且不会返回值。
在return
-语句后面放任何代码都毫无意义。它根本无法执行,无论它是一个有效的语句,还是在您的情况下类似的异常。使用return
,您将进入执行堆栈而不会返回,因此应用程序无法在单个return
语句之后检查代码。
您应该返回特定值或抛出异常,否则两者都不起作用。话虽如此,return
和throw
语句都将离开当前方法,返回调用方法。
此外还有yield return
。这有点不同,因为它的意思是"从迭代器方法返回下一个元素"。
return
和throw
都将退出该方法。您的catch
块永远不会抛出异常,因为您只能退出一次。因此,throw
在这里是不可访问的。但是,如果存在finally
块,情况可能会有所不同。请考虑以下代码。
try{
....
}
catch(Exception) {
return null;
throw; // unreachable
}
finally
{
//....
}
即使有任何异常,finally
块内的代码也将执行,return null
返回值将保持缓存状态,直到最终执行为止。
编辑
如果finally块抛出异常,它将向上传播,并且应该是在更高级别上处理。如果未处理异常,则程序将使崩溃
有关更多信息,您可以点击此链接