我刚学Java,对于错误堆栈跟踪中抛出并显示给我的Web应用程序最终用户的格式规则并不熟悉。
我的Oracle数据库经验表明,错误堆栈包含内部信息,例如模式和过程名称以及行号等,这些信息在调试时很有用,但我希望防止用户看到。以下是一个示例:
java.sql.SQLException : ORA-20011: Error description here
ORA-07894: at "NAME_OF_SCHEMA.PROCEDURE_NAME", line 121
ORA-08932: at line 10
我想要向用户显示的字符串是Error description here
。我可以使用正则表达式提取此字符串,因为我知道(1)该字符串始终在第一行上,因此我可以提取错误堆栈的第一行,并且(2)该字符串始终以Error
开头并以该行的结尾结束。[Oracle用户请注意(我不想误导您):仅当使用以Error
开头的错误字符串使用RAISE_APPLICATION_ERROR时,以上内容才适用,否则文本中不会出现Error
]。我的Java问题是:
(1)是否有任何潜在敏感信息您不希望用户在错误堆栈中看到?例如,文件路径,服务器名称/IP等。
(2)Java错误堆栈跟踪是否有任何格式规则,我可以依靠提取非敏感信息?或者,其他人如何解决这个问题?
更新1:
谢谢所有至今为止的回复,它们非常有帮助。虽然许多人评论使用诸如
getUserFriendlyMessage()
之类的函数将错误映射到有用的用户消息,但我想知道是否有人可以扩展此映射。也就是说,对于常见错误(SQL、I/O等),可以使用什么“可靠”的标识符来搜索此错误堆栈以识别发生的错误类型,然后建议将哪个相应的文本字符串映射到此错误消息以显示给用户?@Adarshr在下面的回复中是一个很好的开始。例如,Identified Expected If found in error stack, display this friendly msg to user
------------------- ----------------------------------------------------------
SQLException An error occurred accessing the database. Please contact support at support@companyname.com.
IOException Connection error(?). Please check your internet connection.
假定编译相关的错误不需要解决,而是关注那些在正常使用过程中终端用户可能遇到的错误。以下是一份运行时错误消息列表供参考:http://mindprod.com/jgloss/runerrormessages.html#IOEXCEPTION
另外,是否有可能仅使用堆栈跟踪的第一行来显示给用户?这个链接有点类似于我在上面原始问题中提到的东西:http://www3.ntu.edu.sg/home/ehchua/programming/howto/ErrorMessages.html
例如,如果标识符Exception
经常被使用,可以简单地提取第一行之间的文本。Exception
和第一行末尾之间的文本。我不知道我们是否可以依赖于Exception
总是存在。