API问题中的异常处理

时间:2011-01-12 22:39:54

标签: c# exception exception-handling

我正在用C#编写API。我传播的一些方法中的一些例外,因为我希望用户看到了解异常。但是,我没有一些例外。为了让客户端知道,我是否需要从该方法和该方法的每个被调用方传播? E.g。

a>呼叫b>叫c

如果我从c中重新抛出,我是否需要从b和a?

执行相同的操作

此外,方法的catch块中捕获的异常(例如,b,从a调用)也将被捕获在catch块中。但是,如果a是API的入口点并且b抛出ex,那将会有什么不同;在catch区?

由于

4 个答案:

答案 0 :(得分:2)

异常处理的第一条规则:除非您知道如何处理异常,否则不要捕获异常。代码看起来像catch (Exception ex) { throw ex; }是没有意义的。

  

如果我从c中重新抛出,我是否需要从b和a?

执行相同的操作

不,你没有。 c引发的任何异常都会自动冒出调用堆栈,通过ba并返回客户端代码。

  

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

情况并非如此:如果b发现异常,a将无法看到它,除非b重新抛出异常。

  

但是,如果a是API的入口点而b是抛出ex,那会有什么不同;在catch区?

如果b捕获异常然后重新抛出,则a和客户端都会看到该异常。

顺便说一句,throw ex;是不好的做法。 Exception个对象跟踪它们被抛出的调用堆栈。 throw ex;删除此调用堆栈,这使得调试异常的根本原因变得很困难。相反,要重新抛出您捕获的异常,请使用throw;

答案 1 :(得分:2)

我认为它比你试图描述的要简单得多:如果抛出异常,它就会调用堆栈,直到它被捕获为止。如果根本没有捕获,程序将终止。如果捕获到异常,则由catch块决定如何继续。选项包括:

  1. 以某种方式处理情况,不要再扔了。在那种情况下,执行只是在catch块之后继续。
  2. 重新抛出异常。在这种情况下,异常继续向上移动调用堆栈,直到命中下一个catch块为止。
  3. 抛出另一个异常:与2.相同但抛出不同的异常。通常,新异常将原始异常保留为内部异常。这样,您的API的客户端就可以了解异常最初的来源。

答案 2 :(得分:1)

首先,如果您打算处理它,您应该只捕获异常。如有必要,这可以包括记录。

如果你抓住了它,但又想重新投掷,请使用:

throw;

throw ex;

每次捕获异常时都必须重复此操作。因此,您可能必须在ba中执行此操作,例如,如果两者都捕获它。

答案 3 :(得分:0)

对于这个问题“我是否需要从方法和该方法的每个被调用方传播?” 答案是否定的,你不必在进程中的每个方法中捕获异常,最好的做法是每当你调用一个外部代码时尝试catch,在你的情况下,每次调用api。 在你遇到异常后你可以:

  • 自己处理错误。
  • 重新抛出您创建的新自定义异常。