3

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

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

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

4

5 回答 5

1

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

于 2012-04-16T18:10:47.490 回答
0

如果在发生错误的情况下您不想这样做,那么这样做是非常有意义的。这消除了代码重复和相关代码的分散。但是,如果您正在考虑改变未来的工作方式(如果有可能发生这种情况),我建议您尽可能地降低捕获量(甚至可能完全消除对异常的需要并且只需登录并立即退出)。

如果您使用异常的内部字段(具体message而言,您可以在构建时设置),您甚至可以消除对 3 个不同的 catch 块的需要,而只使用一个(当然,这取决于您在发生错误时的实际操作)。

于 2012-04-16T18:09:36.360 回答
0

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

  1. 变得巨大,以一种信息丰富的方式处理程序可能抛出的每个错误。
  2. 很小但根本没有帮助:“某处发生了一些错误”。

在我看来,最好的结构是捕获错误、记录错误、提醒用户并尽可能退出。没有什么说你的鼠标处理代码不能退出,对吧?

事实上,我会创建一个几乎可以从任何地方调用的错误处理程序类,它会处理通知和日志记录。然后,您的异常处理程序可以使用要显示/记录的消息填充它,并且所有其他代码都是共享的。与在每个函数的末尾添加任何地方相比,委托给此类将花费更少的打字。throws Exception

如果您必须有一个顶级处理程序,它应该只捕获任何意外的运行时错误,以便您可以记录它并向用户显示程序确实因错误而退出,而不仅仅是转储到桌面。所有其他错误——即使你只是想摆脱困境——也应该尽可能地在“异常有意义的地方”被捕获。

于 2012-04-16T18:10:17.780 回答
0

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

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

于 2012-04-16T18:12:25.183 回答
0

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

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

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

于 2012-04-16T19:06:39.820 回答