c#重新抛出异常
本文关键字:抛出异常 | 更新日期: 2023-09-27 18:01:33
当在多个方法之间抛出异常时,所有方法都应该重新抛出异常吗?例如
Method1()
{
Method2();
}
Method2()
{
try
{
// Do something
}
catch
{
throw;
}
}
try
{
Method1();
}
catch
{
// Do something about exception that was thrown from Method2()
}
注意,在Method1()
中,我不需要将Method2()
包裹在try
块中,我应该这样做吗?
您不需要在try
块中包装所有内容。
当你想要catch
某事时,你应该只try
;在以下情况下,你应该只catch
某事:
- 你已经准备好处理异常(做任何需要做的事情,不要让它传播到堆栈),
- 你想在重新抛出它之前对异常做一些事情(例如记录它)(通过使用
throw
的无参数形式), - 您希望通过将异常包装在您自己的另一个异常中来添加详细信息(参见下面Allon Guralnek的优秀评论)。
您不需要尝试、捕获和重新抛出异常,除非您首先有一些特殊的原因需要捕获它们。否则,它们将自动从较低级别函数中冒出来,并将它们抛出到代码中的最高级函数中。从本质上讲,你可以把它们想象成"重新抛出",尽管从技术上讲,这并不是正在发生的事情。
事实上,大多数时候你看到的try
/catch
块都是不正确的。你不应该捕捉异常,除非你能真正处理它们。捕获异常只是为了重新抛出它们是完全没有意义的(实际上被认为是不好的做法)。不要在try
块中包装所有的代码。
注意,通过"处理它们",我的意思是你在catch
块中的代码将根据抛出的特定异常采取一些特定的操作,试图纠正异常条件。
例如,对于FileNotFoundException
,您可能会通知用户无法找到该文件,并要求他们选择另一个文件。
请参阅我在这里的回答,了解更多细节和对"异常处理最佳实践"的全面讨论。