归根结底是完成这项工作需要什么工具。
异常是一个非常强大的工具。在使用它们之前,请询问您是否需要这种功能以及随之而来的复杂性。
异常可能看起来很简单,因为您知道当遇到异常的行时,一切都会停止。但是从这里会发生什么?
是否会发生未捕获的异常?
异常会被全局错误处理捕获吗?
异常是否会通过更嵌套和更详细的错误处理来处理?
您必须了解堆栈中的所有内容才能知道该异常会做什么。这违反了独立性的概念。该方法现在依赖于错误处理来执行您期望的操作。
如果我有一种方法,我不应该关心该方法之外的内容。我应该只关心输入是什么,如何处理它,以及如何返回响应。
当您使用异常时,您实际上是在说,我不在乎从这里发生什么,出了点问题,我不希望它变得更糟,做任何需要做的事情来缓解问题。
现在,如果您关心如何处理错误,您将做更多思考并将其构建到方法的接口中,例如,如果您尝试查找某个对象,如果找不到对象,则可能返回该对象的默认值而不是而不是抛出一些异常,如“找不到对象”。
当您在方法接口中构建错误处理时,不仅该方法的签名更能描述它可以做什么,而且它将如何处理错误的责任放在方法的调用者身上。调用者方法可能能够通过它或不能通过它,如果没有,它会再次向上报告。最终,您将到达应用程序的入口点。现在抛出异常是合适的,因为如果您正在使用应用程序公共接口,您最好对如何处理异常有一个很好的理解。
让我举一个例子来说明我对 Web 服务的错误处理。
级别 1. global.asax 中的全局错误处理 - 这是防止未捕获异常的安全网。永远不应该故意达到这一点。
级别 2. Web 服务方法 - 包装在 try/catch 中,以确保它始终符合其 json 接口。
第 3 级。工作方法 - 这些方法获取数据、处理数据并将其原始返回给 Web 服务方法。
在工作方法中,抛出异常是不对的。是的,我有嵌套的 Web 服务方法错误处理,但是该方法可以在其他可能不存在的地方使用。
相反,如果使用 worker 方法获取记录并且找不到记录,它只会返回 null。Web 服务方法检查响应,当它发现 null 时,它知道它不能继续。Web 服务方法知道它有返回 json 的错误处理,因此抛出异常只会在 json 中返回所发生事件的详细信息。从客户的角度来看,它被打包成易于解析的 json 非常棒。
您会看到每件作品都知道它需要做什么并做到了。当您在混合中抛出异常时,您会劫持应用程序流。这不仅导致难以遵循代码,而且对滥用异常的响应是 try/catch。现在你更有可能滥用另一个非常强大的工具。
我经常看到一个 try/catch 在应用程序中间捕获所有内容,因为开发人员害怕他们使用的方法比看起来更复杂。