Chr*_*ght 3 java error-handling stream
在我的代码库中是(非常简化)以下:
public static void main (String[] args) {
System.out.println("Starting application");
try {
System.out.println("About to validate");
validate(args);
catch (Exception e) {
e.printStackTrace();
}
}
public static void validate(String[] args) {
System.out.println("Your first arg is " + args[0]);
if (someProblemWith(args)) {
System.out.println("Your args are wrong. It should be: ...");
throw new BadArgsException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.请注意,上面的示例代码是设计的,只是为了在异常和堆栈跟踪打印之前显示多个日志语句.这通常意味着我的上一个日志记录语句在堆栈跟踪输出的中间丢失.是否有一种优雅的方式要求e.printStackTrace()语句等待System.out完成其工作?我基本上在寻找堆栈跟踪是发生错误时打印的最后一件事.以下是我的程序的示例输出:
java.lang.Throwable
....
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
Your args are wrong. It should be: ...
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Run Code Online (Sandbox Code Playgroud)
您看到在System.out.println()语句之间打印堆栈跟踪的原因是因为System.out是缓冲的,而System.err(由堆栈跟踪使用)是无缓冲的.
如果您希望文本按照发生事件的确切顺序显示,则需要"取消缓冲" System.out.最简单的方法是在System.err那里使用而不是System.out.
否则,System.out.flush()在catch子句中发生堆栈跟踪之前调用.
选项2:使用Logger课程.
选项3:实现自己的"缓冲区".换句话说,首先将所有内容写入您自己的缓冲区,包括堆栈跟踪(使用.toString()或者您希望),然后在catch刷新您自己的缓冲区.(这有点多余,因为你System.out无论如何都可以冲洗).
- == -
来自评论
当然.本Logger类可用于创建一个更健壮和详细的日志记录经验.这通常是在应用程序中完成的操作.Logger从Logger类中获取类的实例(它是单例),将参数作为将使用的类.然后使用该.log()方法将消息记录到它.有关的好处Logger类是可以在其上设置的水平(例如DEBUG,WARN...),你就能够筛选您希望只什么/显示.然后,"log"消息以统一的方式显示在控制台中,通常采用以下格式:
2010-11-23 14:45:32,032 DEBUG [MyClass] Your message
以上格式来自log4j,但您可以使用标准Java Logger.输出应该类似,可能会少一些.但我确信它可以配置.
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |