不同的异常报告

The different Exception reporting

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

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

在catch 块中有多种方式报告异常。 我找到了几个,但我想周围还有更多:

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

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

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

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

System.println.out() 我认为系统中不存在这样的方法class,请参阅documentation

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

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

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

  • getCause() - returns 可抛出或 null 如果原因不存在
  • getMessage() - returns 此 throwable 的详细信息的字符串消息
  • getStackTrace() - returns throwable
  • 的 StackTraceElement[]
  • printStackTrace() - 有下面描述的两个变体

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

Returns an array of stack trace elements, each representing one stack frame. The zeroth element of the array (assuming the array's length is non-zero) represents the top of the stack, which is the last method invocation in the sequence. Typically, this is the point at which this throwable was created and thrown. The last element of the array (assuming the array's length is non-zero) represents the bottom of the stack, which is the first method invocation in the sequence.

printStackTrace() 或 printStackTrace(PrintStream s) 第一个没有 PrintStream 参数的在标准错误输出流中打印堆栈跟踪(正确猜测!即 err.println())。如果我们希望在文件中打印堆栈跟踪,我们将 printStackTrace() 方法传递给指向文件或其他目标的 PrintStream。

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

记录数据
  • 严重(最高)
  • 警告
  • 信息
  • 其他级别

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

  • 记录简单的文本消息
  • 用于过滤不同日志消息的日志级别
  • 日志类别
  • 日志文件循环
  • 能够加载配置的配置配置文件
  • 巨大的list继续

根据您正在开发的应用程序的要求,您可以使用许多日志记录框架:

  1. Log4j
  2. Java 日志记录 API
  3. Apache Commons API
  4. 更多内容见here and here

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

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

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

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

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

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

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