相关疑难解决方法(0)

避免使用printStackTrace(); 请使用记录器调用

在我的应用程序中,我通过PMD运行我的代码.它向我显示了这条消息:

  • 避免使用printStackTrace(); 请使用记录器调用.

那是什么意思?

java logging pmd printstacktrace

67
推荐指数
4
解决办法
8万
查看次数

Java - 需要一个记录堆栈跟踪的日志包

是否有一个Logger可以轻松记录我的堆栈跟踪(我得到了什么 ex.printStackTrace())?我搜索了log4j文档,发现没有关于记录堆栈跟踪的信息.

我可以自己做

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
logger.error(stacktrace);
Run Code Online (Sandbox Code Playgroud)

但我不想在整个地方复制这些代码.

如果log4j不会为我执行此操作,是否有另一个日志包将为我记录堆栈跟踪?

谢谢.

java logging

13
推荐指数
1
解决办法
7968
查看次数

您是否应该报告例外的消息文本?

考虑一些可以抛出已检查异常的代码(类型异常Exception).catch当然,你的代码是个例外.您不仅要吞下异常,您的代码也会通过您的用户界面以某种方式向用户报告.或许在日志文件中,或使用GUI弹出窗口.

您向用户报告的文本是否应包含例外的消息文本.也就是说,通过提供的文本Throwable.getMessage()Throwable.getLocalizedMessage()

我想不是,但似乎很多人不同意我的意见.那我错了什么?我的论点如下.

  • 抛出异常时创建了消息.因此,它最多只能提供非常低级别的信息,这可能不适合向用户报告.
  • 从哲学上讲,在我看来,使用这个消息反对整个异常点,即将错误处理(throw部分)的检测和启动与处理和报告的完成(部分)分开catch.使用该消息意味着该消息必须适合于报告,这将报告的责任转移到应该仅负责检测和启动的位置.也就是说,我认为getMessage()设计的一部分Throwable是错误的.
  • 邮件未本地化.尽管它的名字,但是getLocalizedMessage()不是很好,因为你可能不知道你想要使用什么语言环境,直到你catch的异常(报告转到你的英语系统管理员读取的系统日志,或者是否在窗口弹出GUI的法国用户?).
  • 我听说Java 7有一个大大改进的异常层次结构IOException,使您能够处理不同catch子句中的不同类型的I/O错误,使getMessage()文本不那么重要.这意味着即使Java设计师也有点不舒服getMessage().

我不是在询问报告堆栈跟踪是否有用.堆栈跟踪仅对建议错误的异常有用.也就是说,对于未经检查的异常.我认为在这种情况下提供异常消息的低级细节不仅有用而且是强制性的.但我的问题涉及已检查的异常,例如file-not-found.

java logging exception

12
推荐指数
3
解决办法
4290
查看次数

Java:我们通常不希望向用户显示错误堆栈跟踪中的哪些信息?

我是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 …

java security stack-trace

11
推荐指数
2
解决办法
2719
查看次数

Java日志记录异常,使用getMessage或toString:log.warn(ex.getMessage())或log.warn(ex)使用开源

我的问题是:最好用getMessage或toString或两者来记录?考虑到开源引发的错误.在评论中看到了问题,但没有得到答案.也许我错过了什么?不要介意记录其中一个的性能损失,但除非有充分的理由,否则不要记录它们.

含义log(ex)或log(ex.getMessage),不是谈论堆栈跟踪.

1,23

记录异常:哪个更好:log.warn(ex.getMessage(),ex)或log.warn(ex,ex);

我注意到有时getMessage返回空或null,所以通常的做法是有任何理由不使用:

log.warn(ex, ex);
Run Code Online (Sandbox Code Playgroud)

因为它似乎打印了类名和消息(如果设置)?我想有一个原因可能是,如果一个子类已经过度使用字符串而不是打印消息,但实际上是否有任何hibernate,apache或spring libs这样做?

java logging exception

8
推荐指数
1
解决办法
1万
查看次数

当*DO*我们在生产系统上显示StackTraces时

在什么特定情况下,可以(甚至推荐)向生产系统上的UI提供StackTrace的最终用户.

有大量的网站和SO文章,人们会问他们是否应该向最终用户展示StackTraces.毫不奇怪,答案是响亮的"不!" .

例如:

但是,我最近与另一位开发人员进行了对话,在那里我花了很多时间来确定为什么堆栈跟踪不应该通过UI传递给用户.那次讨论让我回过头来重新审视我的一个基本(绝对)租户 - 用户永远不会看到生产中的原始StackTrace.

我找不到一个令人信服的理由.但是,我确信有有效的用例,我想要理解它,或者继续坚持我的绝对租户.

user-interface exception-handling stack-trace

6
推荐指数
1
解决办法
760
查看次数

根据条件截断记录器中异常的堆栈跟踪

我正在使用slf4j在控制台和自定义文件中记录自定义异常及其堆栈跟踪。我遇到了一种情况,我不得不截断一些非关键异常的堆栈跟踪。

使用此文档,我在我的logback.xml文件中添加了以下配置

<evaluator name="DISPLAY_EX_EVAL">
    <expression>throwable != null &amp;&amp; throwable instanceof com.abc.NonCriticalException</expression>
    </evaluator>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-30(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]) %-5level
                %logger{150} -%msg%n%ex{full, DISPLAY_EX_EVAL}
            </pattern>
        </encoder>
    </appender>
Run Code Online (Sandbox Code Playgroud)

但是,上述配置会在记录配置的异常期间删除所有堆栈跟踪。有没有办法记录匹配异常的截断堆栈跟踪(1 或 2 行)?

java logging exception logback slf4j

5
推荐指数
1
解决办法
1495
查看次数