C# 您是否会捕获异常,或抛出一个赢得';你不会被抓住吗?

C# 您是否会捕获异常,或抛出一个赢得';你不会被抓住吗?,c#,exception,exception-handling,try-catch,unhandled-exception,C#,Exception,Exception Handling,Try Catch,Unhandled Exception,我曾经处理过这样的例子,在知道围绕异常的代码将捕获特定异常的情况下,我会抛出/重新抛出异常。但是,您有没有想过在知道不会被捕获的情况下抛出异常 或者至少,没有捕捉到异常 异常会立即停止应用程序,除非其处理正确?所以我想我是问你是否会故意让你的申请失效 但是,您有没有想过在知道不会被捕获的情况下抛出异常 我想说,如果您手动抛出异常,大多数情况下您不知道它是否会被捕获。如果您知道它会被捕获,那么您可以自己处理它,而不是一开始就抛出异常 公平地说,我认为这部分取决于您正在进行的编程类型,有时同一个程序

我曾经处理过这样的例子,在知道围绕异常的代码将捕获特定异常的情况下,我会抛出/重新抛出异常。但是,您有没有想过在知道不会被捕获的情况下抛出异常

或者至少,没有捕捉到异常

异常会立即停止应用程序,除非其处理正确?所以我想我是问你是否会故意让你的申请失效

但是,您有没有想过在知道不会被捕获的情况下抛出异常

我想说,如果您手动抛出异常,大多数情况下您不知道它是否会被捕获。如果您知道它会被捕获,那么您可以自己处理它,而不是一开始就抛出异常

公平地说,我认为这部分取决于您正在进行的编程类型,有时同一个程序员最终会构建库和使用该库的代码

你会不会抓住一个例外


如果您没有预料到/没有意识到可能会引发异常。但抛开这一点,假设您知道异常,有时您在某一层知道它,但知道下一层更适合处理它。

这取决于应用程序的类型。Web应用程序可以继续运行,即使在异常冒泡到执行上下文之后也是如此

如果捕获的异常处于无法处理的级别,则通常会“抛出/重新抛出”异常。但是,您几乎总是会为问题添加上下文,至少会在更高的级别添加一些日志,以表示它已被捕获并重新捕获

比如说

A调用B调用C(抛出异常)

B捕获/重新捕获

A接住了

在这种情况下,您希望B添加一些日志记录,以便能够区分B生成和抛出错误,以及C生成和抛出错误。这将使您能够在以后调试和修复问题

一般来说,您几乎永远不会希望异常终止您的程序。最佳实践是捕捉例外并优雅地退出。这允许您保存任何当前打开的信息并释放正在使用的资源,以便它们不会损坏。如果要退出,可以创建自己的“核心转储”信息报告,其中包括捕获致命异常时正在执行的操作

如果让异常终止您的进程,您就失去了获取定制崩溃信息的机会,并且您也跳过了向用户提供友好错误消息然后退出的部分

因此,我建议您始终捕获异常,并且永远不要让它们在您的程序中肆意运行

编辑

如果您正在编写一个库,您必须提前选择您的函数是抛出异常,还是异常安全。在这些情况下,有时您会抛出一个异常,不知道调用方是否会捕获它。但是在这种情况下,捕获它不是您的责任,只要api声明函数可以抛出异常。
(我在寻找一个词,意思是“可能引发异常”…有人知道它是什么吗?它会让我整天感到不安。)

你可能不希望在最终用户可以看到的任何地方出现未捕获的异常,但让API的客户机(其他程序员)决定如何处理异常通常是可以接受的

例如,假设您正在设计一个Java类库。公开一个接受字符串的公共方法。在应用程序中,空输入值将导致错误。与其自己处理错误,不如检查空值,然后抛出IllegalArgumentException


当然,您必须记录您的方法在这种情况下抛出此异常。此行为成为您的方法契约的一部分。

如果您的应用程序主要由其他客户端使用,并且不是独立的,那么如果出现您不知道(或不想)如何处理的情况,并且您没有合理的方法从中恢复,则抛出异常通常是有意义的。客户端应该能够决定如何处理您可能抛出的任何异常

另一方面,如果您的应用程序是端点,则抛出异常本质上变成了一种通知机制,用于提醒人们发生了严重错误。在这种情况下,你需要考虑一些事情:

  • 应用程序的持续运行有多重要?这个错误真的无法恢复吗?抛出异常并终止程序不是你想在航天飞机上做的事情

  • 您是否使用异常作为真实日志记录的代理?几乎没有理由这样做;考虑一个真正的日志机制。捕获异常并让记录器计算出发生了什么

  • < > >强>你试图通过抛出自己的异常来表达什么?< /强>问问自己,抛出一个新的异常有什么价值,并仔细考虑是否没有更好的方法来做你想做的事。

  • 未捕获异常可能会使资源处于不良状态。如果您没有正常退出,通常不会为您清理。如果你需要做的话,确保你明白你在做什么——如果你不打算去做它,至少考虑一下<代码>尝试最后的<代码>块,这样你就可以做一些整理。


    • 这取决于你所说的“被抓住”是什么意思。不管是底层操作系统还是其他什么,某个地方最终会捕获异常

      我们有一个工作区
      try {
        String myString = new String(byteArray, "UTF-8");
      } catch (UnsupportedEncodingException e) {
        // Platform doesn't support UTF-8?  What is this, 1991?
        throw new RuntimeExceptione(e);
      }