我是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
Run Code Online (Sandbox Code Playgroud)
我要向用户显示的字符串是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.
Run Code Online (Sandbox Code Playgroud)
假设编译相关的错误不需要解决,而是关注最终用户在正常使用期间可能遇到的错误.作为参考,这是一个运行时错误消息列表:http://mindprod.com/jgloss/runerrormessages.html#IOEXCEPTION
或者,是否可以使用堆栈跟踪的第一行显示给用户?这个链接就像我在上面的原始问题中所获得的那样:
http://www3.ntu.edu.sg/home/ehchua/programming/howto/ErrorMessages.html
例如,如果Exception …
我最近询问是否要报告getMessage()被捕异常的文本.相当令人惊讶的是,大多数答案误解了我的问题并认为我在询问是否报告了捕获异常的堆栈跟踪,这表明这样做被认为是常态.所以我要问一个跟进问题.
在您catch遇到异常时,您应该在哪种情况下或者不应该报告堆栈跟踪?通过"报告",我包括要求日志框架为您记录堆栈跟踪.
我不是在问一些事情.我在问这个报告是否应该包含堆栈跟踪.
我将在生产服务器下部署我们的Web应用程序.在生产环境中的catch块下包含printStackTrace是否可以接受?(因为catch块下的日志无助于知道错误的确切原因)所以请告诉我,如果在catch块下有printStackTrace是否可以使用?
例如,我故意放置一个无效的端口号,printStackTrace()给我这个信息.
printStackTrace():
java.lang.IllegalArgumentException: port out of range:80800
at java.net.InetSocketAddress.<init>(InetSocketAddress.java:118)
at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)
at sun.net.www.http.HttpClient.New(HttpClient.java:307)
at sun.net.www.http.HttpClient.New(HttpClient.java:324)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
at com.tata.util.XmlClient.execute(HttpXmlClient.java:83)
Run Code Online (Sandbox Code Playgroud)
日志样式:
日志给出了这个(我使用Apache commons日志记录机制进行日志记录)
Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO);
06/Jan/2012 16:25:55 - main:http-8080-2 <> <60990020>**EXCEPTION INSIDE execute java.lang.IllegalArgumentException: port out of range:80800
Run Code Online (Sandbox Code Playgroud)
那么请告诉我在catch块下是否可以使用printStackTrace?
获取异常的堆栈跟踪效率如何?我知道这是昂贵的,但成本如何?它们绝对不能用于生产环境吗?