我正在用C#编写API。我传播某些方法中的某些异常,因为我希望用户看到该异常。但是,有些例外我没有。为了让客户端知道,我是否需要从该方法以及该方法的每个被调用者中传播?例如。
a>通话b>通话c
如果我从c处抛出,我是否需要从b和a处做同样的事情?
同样,在方法的catch块中捕获的异常(例如b,从a调用)也将在a的catch块中捕获。但是,如果a是API的入口点并且b抛出了ex,那会有什么区别?在捕获块?
谢谢
最佳答案
异常处理的第一条规则:除非您知道如何处理异常,否则不要捕获异常。看起来像catch (Exception ex) { throw ex; }
的代码毫无意义。
如果我从c抛出,我是否需要从b和a进行相同的操作?
不,你没有。 c
引发的任何异常将通过b
和a
自动使调用堆栈冒泡,并返回到客户端代码。
同样,在方法的catch块中捕获的异常(例如b,从a调用)也将在a的catch块中捕获。
事实并非如此:如果b
捕获到异常,除非a
抛出异常,否则b
不会看到它。
但是,如果a是API的入口并且b抛出了ex,那会有什么区别?在捕获块?
如果b
捕获到异常,然后重新引发,则a
和客户端都将看到该异常。
顺便说一句,throw ex;
是不好的做法。 Exception
对象跟踪从其引发的调用堆栈。 throw ex;
删除此调用堆栈,这使得调试异常的根本原因变得困难。相反,要重新引发已捕获的异常,请使用throw;
。