考虑一些可以抛出已检查异常的代码(类型Exception
的例外)。当然,您的代码catch
是例外。您不仅要吞下异常,您的代码也会通过您的用户界面以某种方式向用户报告。或许在日志文件中,或使用GUI弹出窗口。
您向用户报告的文本是否应包含例外的消息文本。也就是说,Throwable.getMessage()
或Throwable.getLocalizedMessage()
?
我想不是,但似乎很多人不同意我的意见。那我错了什么?我的论点如下。
throw
部分)的检测和启动与处理和报告的完成分开({{1}部分)。使用该消息意味着该消息必须适合于报告,这将报告的责任转移到应该仅负责检测和启动的位置。也就是说,我认为catch
设计的getMessage()
部分是错误的。Throwable
并不是很好,因为在您getLocalizedMessage()
异常之前,您可能不知道要使用的区域设置(是您的英文系统管理员读取系统日志的报告,或者它是否在GUI的法国用户的窗口中弹出?)。catch
提供了一个大大改进的异常层次结构,使您能够处理不同IOException
子句中的不同类型的I / O错误,使catch
文本更少重要。这意味着即使Java设计师对getMessage()
感到有点不舒服。我不是在询问报告堆栈跟踪是否有用。堆栈跟踪仅对建议错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下提供异常消息的低级细节不仅有用而且是强制性的。但我的问题涉及已检查的异常,例如file-not-found。
答案 0 :(得分:7)
不,不应该直接在错误消息中直接向用户显示异常,它们是低级技术细节,并且用户几乎总是想要更容易理解的东西,即使它不提供与堆栈一样多的信息跟踪会!
我几乎总是说,因为有些情况(例如在IDE中)你可以认为你的用户在技术上足够能够看到堆栈跟踪;事实上,在这种情况下,他们可能更喜欢它是一个“愚蠢的”错误信息。
但是,我个人认为堆栈跟踪应始终记录在用户可以访问的某个位置,这样如果他们抱怨“程序不能正常工作”,您可以看到他们发送给您的文件到底发生了什么。
答案 1 :(得分:5)
如果您向用户提供错误条件,则应该是用户友好的消息。例外包含用户不应该/不需要知道的技术细节。
在某些情况下,呈现堆栈跟踪信息可能是一个安全问题,因此永远不应该向用户显示堆栈跟踪。
如果您向用户显示错误消息,则有一点您有意识地决定显示弹出窗口,或者向日志窗口添加消息。此时,您可以将任何异常转换为更加用户友好的消息。请注意,您可能需要比默认Exception
类型提供的更多信息,因此您可以/应该创建自己的Exception
类型,其中包含向用户显示所需的所有数据所需的所有信息
答案 2 :(得分:4)
在某些项目中,我发出了一种特殊的异常(例如UserFriendlyException)。此异常类型必须具有用户友好的错误消息。如果我发现这样的异常,我可以将其显示给用户。
这样就可以将异常用于用户友好的错误,并防止向用户显示非常技术性的消息。
答案 3 :(得分:0)
我认为你永远不应该向用户显示异常消息本身,它应该只出现在日志中。即使您有目的地使用户友好,它仍然不会显示,因为您无法轻松地将这些消息国际化。您应该想出一些UI层可以理解的机制,并将其解析为可以查找国际化消息以显示给用户的代码。我发现带有“code”属性/ enum的异常非常有效。非常具体的异常也有效,但维护起来可能很麻烦。