内部或外部的错误处理?

时间:2009-11-28 18:38:00

标签: design-patterns error-handling

通常我会在每个methodtrycatch)的课程中尽我所能。我做错了吗?最近我听说更好的方法是在程序体中处理错误......

什么是好习惯?

6 个答案:

答案 0 :(得分:7)

如果您可以处理异常,那么请执行此操作。如果你做不到,那就让异常泡到可能的人那里!

答案 1 :(得分:4)

一些一般性的想法:

  1. 仅针对异常错误条件抛出异常。

  2. Fail fast.

  3. 由于您只是为异常错误条件抛出异常,因此假设您无法在类中修复它,因此异常应该冒泡调用堆栈。无论你是在它上面的直接上课中处理它,还是在一个捕获物中处理它,都取决于你。

答案 2 :(得分:2)

通常,只要您需要将异常“转换”给最终用户,就应该在业务/控制器逻辑/层中完成异常处理。因此,不在例如数据层,模型层,视图层和实用程序类中。

捕获运行时异常(例如空指针,算术错误,数组索引超出范围等)通常应该。它们通常只表示编程错误。您应该相应地编写代码,以便它们永远不会出现(例如if (x != null) { x.doStuff() })。

答案 3 :(得分:2)

您与异常的交互方式取决于您的代码在应用程序层中的位置。一般来说,错误报告是UI的问题,通常最好留给应用程序,即最外层的代码。

低级代码和中级业务逻辑代码通常在不同的应用程序之间共享。由于不同的应用程序对于应向用户报告的错误数量和错误数量将有不同的策略,因此低级别和中级代码应避免出于错误报告的目的而处理异常。让应用程序这样做。

在低级和中级代码中捕获异常有很多合理的理由,特别是在主路径失败时尝试备用路径,或者将低级异常转换为更具体的异常目前的运作。小心不要过分,尽可能具体地使你的异常陷阱(不要过度概括,否则你将陷入你不准备处理的事情),并且非常批评完全在中低级别压制异常代码。

低级和中级代码的一般原则应该是:如果调用者请求的操作失败,则让调用者看到后果 - 异常。

你的低级和中级代码通常会自然地落入两个阵营:“硬”函数执行请求的操作或抛出异常(如果无法完成),以及“软”函数更方便用于实验探测。如果一个操作在大多数情况下可能会失败,比如“FileExists()”,则可能很少使用异常来在失败时抛出异常并要求调用者在异常处理程序中包含对该函数的所有调用。这将为调用者创造更多的工作。在这个用例中,FileExists()应该是一个“soft”函数,它返回true / false而不是throw。这个的“硬”版本可能被称为“RequireFile()”,如果找不到该文件则会抛出。

作为命名模式,您经常会将“Try”视为软函数的前缀。因此,GetData()将是一个硬函数,如果它无法完成工作将抛出,而TryGetData()将是返回布尔值而不是抛出的软函数。根据用途,通常可以在类或库中查看这两个函数。

这些对通常实现为一个调用另一个 - GetData()调用TryGetData()并在TryGetData()返回false时抛出,或者TryGetData()在try..catch块内调用GetData()。使用哪种模式取决于函数所做工作的复杂性。如果布尔逻辑很容易检测到故障情况(异常风险低),那么TryGetData将是主要实现。如果失败案例因异常而失败,则GetData将成为主要实现。

“硬”功能让调用者充分利用异常来简化程序逻辑 - 如果此调用成功,那么我可以使用调用结果继续下一步。如果此调用失败,则会抛出异常,下一步将不会执行。 “硬”函数让你通过一系列操作进行爆破,并正确地假设每个操作都返回合法的结果,因为如果一个操作不能返回合法的结果,它将抛出并将我们从这个操作序列中驱逐出去。这使您可以集中主路径程序逻辑,而不会出现消防队伍错误处理的混乱 - 分析每次调用时的函数错误代码并决定如何处理它们。

答案 4 :(得分:0)

只要你能做出有效的反应,你就应该处理异常。如果它必须升高,那么就让它。

我还会在一些层低于我的代码的情况下重新打包异常。在使用Java进行SQL调用时,可以看到一个很好的示例。所有东西都会抛出一个SQLException,如果我有一个可以触发多个异常但无法处理它们的方法,这没有用。通过重新打包,我可以在失败的连接和构建预准备语句的问题之间进行区分和反应。

答案 5 :(得分:0)

我认为最好的方法可能是混合方法。

在课堂上执行与课程有关的问题的错误处理。例如,如果属性设置器进行验证,则会从类中检测并抛出这些错误。

在网页或表单级别,您可以在一种方法中处理所有错误。例如,对于ASP.Net Web应用程序,您可以使用Page_Error方法捕获到达页面的所有异常。然后,显示类属性设置器抛出的错误消息文本。

或者,您可以在每个方法签名中包含errorMessage字符串返回值。调用页面/表单检查errorMessage的内容,并根据上下文决定要执行的操作。这需要比上述方法更多的编码。

有时,班级不知道事件是否真的是错误。例如,如果类方法从数据库中选择记录并返回其数据,则该类不知道这是否是错误。如果调用类方法的页面/表单是搜索页面,则不返回任何记录不是错误,它是“未找到记录”,并且显示该信息。