【问题标题】:The different Exception reporting不同的异常报告
【发布时间】:2023-04-02 20:35:01
【问题描述】:

我只是在考虑 java 异常。有许多不同的类型,它们都各司其职。我很好奇的是他们的处理方式。例如

try
{
    //Protected code
}catch(ExceptionName e1)
{
    //Catch block
}

在 catch 块中,有多种方法可以报告异常。 我找到了几个,但我认为还有更多:

  • System.err.println(e1); 用于调试
  • system.println.out(e1); 仅查看错误以进行本地验证
  • e1.printStackTrace(); 只查看错误
  • Logger.getLogger(classname.class.getName()).log(Level.SEVERE, null, e1); 如果我是正确的,调试、信息和错误的级别可能会有所不同。

为什么你会选择一个而不是另一个?我能想到的只是它报告的信息吗?因此,对于简短的错误,您只需打印异常,而在寻找实际问题时,您将使用更大的错误。如果你知道会有异常,但认为它不重要,可以直接抛出它吗?

异常处理是测试代码的好工具吗?可以代替Black-Box-testing吗?

【问题讨论】:

  • 处理程序无法自行处理的异常最重要的是尽可能多地捕获信息。否则,必须诊断和修复它的开发人员将没有太多工作要做。 Java 使显示堆栈跟踪变得非常容易。至少打印那个(你的前两种方法不会)。下一步是添加一些相关的上下文信息(用户 ID、方法参数、调用者状态等)。
  • @Thilo 感谢您的评论。对于阅读代码并需要修复它的每个人来说,添加附加信息总是很方便。显示一个 stracktrace 可以找到它到底哪里出错了。

标签: java logging error-handling exception-handling black-box-testing


【解决方案1】:

您的问题主要是关于日志记录的,根据您的要求和应用程序的复杂性,有几种方法可以做到这一点。它们之间显然存在差异,例如:

System.out.println() 使用 Scanner 类的 PrintStream out 静态对象将传递的参数打印到控制台。 println()PrintStream 类的方法。绝对不是一个合适的日志记录解决方案。

System.println.out() 我认为System类中不存在这样的方法,参见documentation

System.err.println() 确实存在,并且又是 PrintStream 类的静态对象。这是标准错误输出流,它已经打开,正在等待接收应该引起用户注意的数据。

如果您使用控制台,您将无法看到 err.println()out.println() 之间的区别。您显然可以配置它们,以便 err.println() 在文件中输出所有错误。

Java 的 Exception 类扩展了 Throwable 并实现了 Serializable 接口。 Exception 继承了 Throwable 类的以下所有方法:

  • getCause() - 如果原因不存在,则返回 Throwable 或 null
  • getMessage() - 返回此 throwable 详细信息的字符串消息
  • getStackTrace() - 返回 throwable 的 StackTraceElement[]
  • printStackTrace() - 有两种变体,如下所述

getStackTrace() 让您以编程方式访问堆栈跟踪。

返回堆栈跟踪元素数组,每个元素代表一个堆栈 框架。数组的第零个元素(假设数组的长度是 non-zero) 表示栈顶,也就是最后一个方法 按顺序调用。通常,这是该点 throwable 被创建并抛出。数组的最后一个元素 (假设数组的长度不为零)表示底部 堆栈,这是序列中的第一个方法调用。

printStackTrace() 或 printStackTrace(PrintStream s) 第一个不带 PrintStream 参数的会在标准错误输出流中打印堆栈跟踪(猜对了!即 err.println()强>)。如果我们希望在文件中打印堆栈跟踪,我们传递 printStackTrace() 方法 PrintStream 指向文件或其他目的地。

好的,现在回到日志记录。有几个日志框架允许您以不同的严重级别记录数据。例如,您有一个企业应用程序,您希望根据

  • 严重(最高)
  • 警告
  • 信息
  • 其他级别

日志框架可以用来做很多事情,下面列出了几个:

  • 记录简单的短信
  • 过滤不同日志消息的日志级别
  • 日志分类
  • 日志文件轮换
  • 能够加载配置的配置配置文件
  • 巨大的list继续

根据您正在开发的应用程序的需求,您可以使用一堆日志框架:

  1. Lo​​g4j
  2. Java 日志记录 API
  3. Apache Commons API
  4. herehere 中查看更多信息

其中一些日志框架有基准测试结果,例如,请参阅here 以比较 Log4j、Logback 和 Java Logging API。

您有很多选项可供选择,具体取决于您的项目需求、项目的复杂性和您希望达到的日志记录级别。

Exception handling good for testing? No. 
Is logging good for testing? No.

异常处理是指处理意外情况。例如,您期望整数输入,然后您得到字符串。如果您不处理这种情况,则执行会中断,因此,您编写 try 和 catch 块来捕获此类异常,然后警告用户她/他应该只输入一个整数。像这样有很多异常,异常会导致代码的执行停止。如果用户能够停止执行您的代码,那么这不是一个好的程序,因此,您需要异常处理才能处理任何类型的用户、输入的数据等。

您不能使用异常处理来进行测试,但它确实对您有所帮助。如何?异常处理可以与测试框架一起使用,以帮助您手动抛出不同类型的异常,然后使用您的异常处理代码进行处理。

日志不能用于测试,但可以用于测试。您可以将日志框架与 JUnit 等测试框架一起使用,以便运行测试并记录在测试执行期间发生的所有事件。您可以配置您的日志框架以在每次执行测试时创建一组特殊的日志文件。

如果您希望进行日志记录并希望将来成为一名程序员(您可能已经是),那么您肯定需要使用测试框架进行测试,使用日志框架进行日志记录和异常处理来处理异常。

【讨论】:

  • 感谢您的详细解释。这对我来说很清楚。
  • 很高兴它有所帮助,请浏览文档和其他链接以获得更详细的想法。
  • 在“堆栈”上发帖之前,我确实会尝试进行研究。大多数情况下,javadoc 很清楚,但有关此的文档只会让我更加困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多