提问人:Raedwald 提问时间:9/6/2011 最后编辑:Raedwald 更新时间:10/9/2019 访问量:6279
是否应该报告异常的消息文本?
Should you report the message text of exceptions?
问:
请考虑一些可以引发已检查异常(异常类型异常
)的代码。当然,您的代码是例外。您也不只是吞下异常,您的代码会通过用户界面以某种方式将其报告给用户。也许在日志文件中,或者使用 GUI 弹出窗口。catch
您向用户报告的文本是否应包含异常的消息文本。也就是说,Throwable.getMessage() 或 Throwable.getLocalizedMessage()
提供的文本?
我认为不是,但似乎很多人不同意我的观点。那我做错了什么?我的论点如下。
- 该消息是在引发异常时创建的。因此,它充其量只能提供非常低级的信息,这些信息可能不适合向用户报告。
- 从哲学上讲,在我看来,使用该消息似乎违背了异常的整个要点,即将错误处理的检测和启动(部分)与处理和报告的完成(部分)分开。使用消息意味着消息必须有利于报告,这会将报告的责任转移到应仅负责检测和启动的位置。也就是说,我认为设计的那部分是一个错误。
throw
catch
getMessage()
Throwable
- 邮件未本地化。尽管它的名字,并不是很好,因为你可能不知道你想使用什么语言环境,直到你出现异常(报告是转到你的英语系统管理员读取的系统日志,还是在GUI的法语用户的窗口中弹出?
getLocalizedMessage()
catch
- 我听说 Java 7 有一个大大改进的异常层次结构,使您能够在不同的子句中处理不同类型的 I/O 错误,从而使文本变得不那么重要。这意味着即使是 Java 设计人员也对 .
IOException
catch
getMessage()
getMessage()
我不是在问报告堆栈跟踪是否有用。堆栈跟踪仅对表明错误的异常有用。也就是说,对于未选中的异常。我认为在这种情况下,提供异常消息的低级细节不仅有用,而且是强制性的。但我的问题涉及已检查的异常,例如找不到文件。
我不是在问消息文本的“最佳实践”。
答:
如果要向用户显示错误条件,则它可能应该是用户友好的消息。例外情况包含用户不应/不需要知道的技术细节。
在某些情况下,提供堆栈跟踪信息可能是一个安全问题,因此不应向用户显示堆栈跟踪。
如果要向用户显示错误消息,则在某些时候,您有意识地决定显示弹出窗口或向日志窗口添加消息。此时,您可以将任何异常转换为更用户友好的消息。请注意,您可能需要比默认类型提供的信息更多的信息,因此您可以/应该创建自己的类型,这些类型包含向用户显示所需的所有数据所需的所有信息。Exception
Exception
评论
在某些项目中,我做了一个特殊的例外(例如UserFriendlyException)。此异常类型必须具有用户友好的错误消息。如果我发现这样的异常,我可以将其显示给用户。
这样就可以对用户友好的错误使用异常,并防止向用户显示非常技术性的消息。
评论
throw
catch
getMessage()
getFriendlyMessage()
不,异常不应该直接在错误消息中直接显示给用户,它们是低级技术细节,用户几乎总是想要更易于理解的东西,即使它没有像堆栈跟踪那样提供那么多的信息!
我之所以这么说,几乎总是因为在某些情况下(例如在 IDE 中),您可以认为您的用户在技术上有足够的能力来查看堆栈跟踪;事实上,在这种情况下,他们可能更喜欢它而不是“愚蠢”的错误消息。
但是,就我个人而言,我认为堆栈跟踪应该始终记录在用户可以访问的地方,这样如果他们抱怨“程序无法正常工作”,您可以确切地看到如果他们向您发送该文件发生了什么。
我认为你永远不应该向用户显示异常消息本身,它应该只出现在日志中。即使您有目的地使其用户友好,它仍然不应该显示,因为您无法轻松地将这些消息国际化。您应该想出一些机制,您的 UI 层可以理解,并将其解析为您可以查找国际化消息以显示给用户的代码。我发现带有“code”属性/枚举的异常效果很好。非常具体的例外也可以,但维护起来可能会很麻烦。
评论