我正在用C#编写API。我传播的一些方法中的一些例外,因为我希望用户看到了解异常。但是,我没有一些例外。为了让客户端知道,我是否需要从该方法和该方法的每个被调用方传播? E.g。
a>呼叫b>叫c
如果我从c中重新抛出,我是否需要从b和a?
执行相同的操作此外,方法的catch块中捕获的异常(例如,b,从a调用)也将被捕获在catch块中。但是,如果a是API的入口点并且b抛出ex,那将会有什么不同;在catch区?
由于
答案 0 :(得分:2)
异常处理的第一条规则:除非您知道如何处理异常,否则不要捕获异常。代码看起来像catch (Exception ex) { throw ex; }
是没有意义的。
如果我从c中重新抛出,我是否需要从b和a?
执行相同的操作
不,你没有。 c
引发的任何异常都会自动冒出调用堆栈,通过b
和a
并返回客户端代码。
此外,方法的catch块中捕获的异常(例如,b,从a调用)也将被捕获在catch块中。
情况并非如此:如果b
发现异常,a
将无法看到它,除非b
重新抛出异常。
但是,如果a是API的入口点而b是抛出ex,那会有什么不同;在catch区?
如果b
捕获异常然后重新抛出,则a
和客户端都会看到该异常。
顺便说一句,throw ex;
是不好的做法。 Exception
个对象跟踪它们被抛出的调用堆栈。 throw ex;
删除此调用堆栈,这使得调试异常的根本原因变得很困难。相反,要重新抛出您捕获的异常,请使用throw;
。
答案 1 :(得分:2)
我认为它比你试图描述的要简单得多:如果抛出异常,它就会调用堆栈,直到它被捕获为止。如果根本没有捕获,程序将终止。如果捕获到异常,则由catch块决定如何继续。选项包括:
答案 2 :(得分:1)
首先,如果您打算处理它,您应该只捕获异常。如有必要,这可以包括记录。
如果你抓住了它,但又想重新投掷,请使用:
throw;
不
throw ex;
每次捕获异常时都必须重复此操作。因此,您可能必须在b
和a
中执行此操作,例如,如果两者都捕获它。
答案 3 :(得分:0)
对于这个问题“我是否需要从方法和该方法的每个被调用方传播?” 答案是否定的,你不必在进程中的每个方法中捕获异常,最好的做法是每当你调用一个外部代码时尝试catch,在你的情况下,每次调用api。 在你遇到异常后你可以: