永远不要安抚编译器。领导他们,让他们做你需要的事情,否则他们会超越自己。
编译者有顺从的性格,喜欢被老板欺负;一旦你开始安抚他们,他们就会停止帮助你。他们中的一些人甚至自带桨。
如果你必须问这个问题,你可能采取了错误的方法。“吞下异常时返回什么值”的答案是“在这个地方吞下这个异常时要返回的值是显而易见的值”。如果没有什么明显的,那么它不应该被吞下(这同样适用于“在这个地方吞下这个异常后循环中明显的地方继续”)。然后仔细检查您的假设,因为“显而易见”的事情仍然可能是错误的。
您还应该清楚地注释任何吞咽,因为这通常是一件坏事,以至于任何阅读代码的人都会从假设它是坏代码开始,除非您解释为什么不是。
您最好使用以下方法之一:
throw;
让异常过去。有东西处理它,或者没有东西,你会收到一条错误消息和关闭(并不总是更糟糕的事情,取决于应用程序和错误的可能性)。
throw e;
这将引发完全相同的异常(实际上是相同的实例),但会被视为来自您的代码,而不是您调用的代码。这很少是正确的事情,以至于有些人会告诉你这是完全错误的。我不同意,但我同意这种情况很少见——比如吞咽,如果这不是明显的选择,那几乎肯定是错误的选择,如果是明显的选择,它可能仍然是错误的选择。
throw new ExceptionTypeAppropriateToThisMethodCall("a useful message");
或者
throw new ExceptionTypeAppropriateToThisMethodCall("a useful message", e);
在这里,您将异常转换为与您的方法提供给调用代码的服务更密切相关的东西。第二种形式包装了诊断良好的内部异常。
在某些情况下,仅仅终止应用程序或卸载应用程序域可能是最好的选择,尽管这主要是因为在任何时候都没有处理异常。