C# API问题中的异常处理

C# API问题中的异常处理,c#,exception,exception-handling,C#,Exception,Exception Handling,我正在用C编写一个API。我传播了一些方法中的一些异常,因为我希望用户看到并意识到异常。然而,有些例外我不知道。为了让客户机知道,我是否需要从该方法以及在该方法的每个被调用方中进行传播?例如 a>呼叫b>呼叫c 如果我从c重复,我需要从b和a重复吗 此外,在方法的catch块中捕获的异常(例如从a调用的b)也将在a的catch块中捕获。但是如果a是API的入口点,而b有抛出ex,那么会有什么区别呢;在接球区 谢谢首先,只有在您打算处理异常时,才应该捕获异常。如有必要,这可以包括日志记录 如果您抓

我正在用C编写一个API。我传播了一些方法中的一些异常,因为我希望用户看到并意识到异常。然而,有些例外我不知道。为了让客户机知道,我是否需要从该方法以及在该方法的每个被调用方中进行传播?例如

a>呼叫b>呼叫c

如果我从c重复,我需要从b和a重复吗

此外,在方法的catch块中捕获的异常(例如从a调用的b)也将在a的catch块中捕获。但是如果a是API的入口点,而b有抛出ex,那么会有什么区别呢;在接球区


谢谢

首先,只有在您打算处理异常时,才应该捕获异常。如有必要,这可以包括日志记录

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

throw;
不是


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

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

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

throw;
不是

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

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

如果我从c重复,我需要从b和a重复吗

不,你没有。c抛出的任何异常都会通过b和a自动在调用堆栈中冒泡,并返回到客户机代码中

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

事实并非如此:如果b捕获到异常,a将不会看到它,除非b重新调用它

但是如果a是API的入口点,而b有抛出ex,那么会有什么区别呢;在接球区

如果b捕获到异常,然后重新抛出,那么a和客户机都将看到该异常

顺便说一句,扔掉ex;这是坏习惯。异常对象跟踪抛出它们的调用堆栈。掷骰子;擦除此调用堆栈,这使得调试异常的根本原因变得困难。相反,要重新抛出捕获的异常,请使用throw

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

如果我从c重复,我需要从b和a重复吗

不,你没有。c抛出的任何异常都会通过b和a自动在调用堆栈中冒泡,并返回到客户机代码中

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

事实并非如此:如果b捕获到异常,a将不会看到它,除非b重新调用它

但是如果a是API的入口点,而b有抛出ex,那么会有什么区别呢;在接球区

如果b捕获到异常,然后重新抛出,那么a和客户机都将看到该异常


顺便说一句,扔掉ex;这是坏习惯。异常对象跟踪抛出它们的调用堆栈。掷骰子;擦除此调用堆栈,这使得调试异常的根本原因变得困难。相反,要重新抛出捕获的异常,请使用throw

对于这个问题,我是否需要从该方法以及该方法的每个被调用方进行传播? 答案是否定的,您不必在流程中的每个方法中捕获异常,最佳实践是在调用外部代码时(在您的情况下,每次调用api时)放置一个try-catch。 捕获异常后,您可以:

自己处理错误。 重新抛出您创建的新自定义异常。
对于这个问题,我是否需要从该方法以及在该方法的每个被调用方中传播? 答案是否定的,您不必在流程中的每个方法中捕获异常,最佳实践是在调用外部代码时(在您的情况下,每次调用api时)放置一个try-catch。 捕获异常后,您可以:

自己处理错误。 重新抛出您创建的新自定义异常。
我认为这比您试图描述的要简单得多:如果抛出异常,它将进入调用堆栈,直到被捕获。如果它根本没有被捕获,程序将终止。如果捕获到异常,则由catch块决定如何继续。这些选择包括:

设法处理好这种情况,不要再扔了。在这种情况下,执行仅在catch块之后继续。 重新显示异常。在这种情况下,异常将继续沿着调用堆栈向上移动,直到命中下一个catch块。 抛出另一个异常:与2相同。但是抛出了一个不同的异常。通常,新异常将原始异常作为内部异常保存 在…上这样,API的客户端就可以知道异常最初来自何处。
我认为这比您试图描述的要简单得多:如果抛出异常,它将进入调用堆栈,直到被捕获。如果它根本没有被捕获,程序将终止。如果捕获到异常,则由catch块决定如何继续。这些选择包括:

设法处理好这种情况,不要再扔了。在这种情况下,执行仅在catch块之后继续。 重新显示异常。在这种情况下,异常将继续沿着调用堆栈向上移动,直到命中下一个catch块。 抛出另一个异常:与2相同。但是抛出了一个不同的异常。通常,新异常将原始异常作为内部异常保存。这样,API的客户端就可以知道异常最初来自何处。
当我注意到我继承的这堆代码抛出了ex;在所有的地方,我立即按下Shift+Ctrl+H并运行一个全局查找和替换来抛出;。当我注意到我继承的这一堆代码抛出了ex;在所有的地方,我立即按下Shift+Ctrl+H并运行一个全局查找和替换来抛出;。看着除了Main之外什么都不包含的堆栈跟踪,我真是疯了……对不起,我是说抛出,保留堆栈跟踪。