我是 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 用户注意事项(我不想误导您):上述内容仅适用于使用带有以 开头的错误字符串的 RAISE_APPLICATION_ERROR 时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
一直在那里。