Java错误处理 - 将异常抛给集中式错误处理程序更好吗?

时间:2012-04-16 18:04:54

标签: java error-handling

我在Java中有一个相当复杂的小游戏(纸牌游戏,基本上就像Windows版本),但我还没有做很多错误处理。

我的类中的几乎所有方法都将最终被初始构造函数(最终为main()),paintComponent()方法或鼠标事件调用。所以,我的问题是,在我的所有低级方法上使用“throws Exception”是不好的做法,并且只在我的顶级方法中执行try / catch以立即捕获所有错误? (例如3次尝试/捕获 - 一次用于绘画,一次用于鼠标事件,一次用于主要方法)。

我意识到这使我无法轻易地在现场处理错误,但我并不打算这样做。我的错误处理将包括写入日志,告诉用户和终止程序。牢记这一点,以这种方式处理我的错误有什么不好吗?

5 个答案:

答案 0 :(得分:1)

这取决于你想要如何应对这种情况 如果你只是想捕获任何可能的异常并且你不介意处理程序代码,你可以简单地使用“抛出异常”,并且它也没有任何坏处。它就像一个涵盖所有功能的试用块 如果要为特定异常编写特定代码,则应使用try-catch块为每个处理程序编写适当的代码 根据您的说法,任何捕获的异常都会通知用户并退出应用程序。那么,在这种情况下,你可以使用第一种方法。它不一定是最好的方法,也不是杀死应用程序,但是,如果这是你的策略,你可以只为每个功能使用“抛出”。
希望有所帮助!

答案 1 :(得分:0)

如果这是你在错误的情况下不想做的事情,那么这样做是完全合理的。这消除了代码重复和相关代码的散布。但是,如果您正在考虑改变未来的工作方式(如果有可能发生这种情况),我建议尝试尽可能地推动问题(甚至可能根本不需要例外情况)只是记录并立即退出。)

如果你使用异常的内部字段(特别是message,你可以在构造时间设置),你甚至可以不需要3个不同的catch块而只需使用一个(取决于你的实际操作)当然是错误的。)

答案 2 :(得分:0)

我不会 - 最重要的原因是它破坏了封装。 为什么这个在这种情况下很重要的原因是你的错误处理代码有两个未来之一:

  1. 以一种信息丰富的方式处理程序可以抛出的每一个错误。
  2. 很小但根本没有帮助:“某处发生了一些错误”。
  3. 在我看来,最好的结构是捕获错误,记录错误,提醒用户,并尽可能远地退出 。什么都没说,你的鼠标处理代码无法退出,对吧?

    实际上,我会创建一个可以在任何地方调用的错误处理程序类,它会处理通知和日志记录。然后,您的异常处理程序可以使用要显示/记录的消息填充它,并共享所有其他代码。委托给这个班级的 less 键入比在每个函数的末尾添加throws Exception要花费更少。

    如果你必须有一个顶级处理程序,它应该只捕获任何意外的运行时错误,这样你就可以记录它并向用户显示该程序实际上已经退出错误,而不仅仅是转储到桌面。所有其他错误 - 即使你只是想要拯救 - 应尽可能接近“异常具有意义的地方”。

答案 3 :(得分:0)

我做的事情与你大部分时间都在描述的一样。你基本上做的是解决Java所具有的愚蠢的已检查异常。甚至不需要在任何地方添加“抛出异常”。

如果我正在处理其他用户将使用的API,我可能会创建特定的异常来显示正在发生的事情,以防他们想要以不同的方式处理不同的异常。

答案 4 :(得分:0)

如果错误严重到总是退出程序,那么最好抛出RuntimeException。它们用于指示不可恢复的错误,并避免在任何地方放置“抛出异常”的问题。无论如何,您应该拥有RuntimeExceptions的处理程序,以便在发生时提供用户友好的错误报告。

如果抛出已检查的异常,它们应尽可能具体。抛出和捕获异常可以隐藏您不想要并且可能以不同方式处理的其他抛出的异常(包括RuntimeExceptions)。如果你想抛出一般异常,你总是可以创建自己的异常类并改为抛出它。

异常处理可能取决于上下文,因此没有一种方法可以处理所有事情。如果用户单击按钮打开文件并且读取它时出错,则可以将IOException抛出到UI层并在那里显示错误消息。另一方面,创建临时文件时的IOException可以通过在另一个目录中重试来降低。