我正在用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引发的任何异常将通过ba自动使调用堆栈冒泡,并返回到客户端代码。


  同样,在方法的catch块中捕获的异常(例如b,从a调用)也将在a的catch块中捕获。


事实并非如此:如果b捕获到异常,除非a抛出异常,否则b不会看到它。


  但是,如果a是API的入口并且b抛出了ex,那会有什么区别?在捕获块?


如果b捕获到异常,然后重新引发,则a和客户端都将看到该异常。

顺便说一句,throw ex;是不好的做法。 Exception对象跟踪从其引发的调用堆栈。 throw ex;删除此调用堆栈,这使得调试异常的根本原因变得困难。相反,要重新引发已捕获的异常,请使用throw;

09-10 10:16
查看更多