Java Exception信息的日志输出
http://fly-hyp.iteye.com
这篇文档是用word写的,web格式不完整如需要请看附件
1.概要
这篇文章讲的是Java中异常日志的主题,主要是讲他们在所有软件过程中如何帮助调试错误的。如果您是初级的Java水平,这篇文章会指导您如何使用日志(Log4j)和异常。如果您是资深的Java工程师,和我一样,一定也遇到整个项目团队关于异常日志滥用的行为。您也希望给初级工程师写一个指导,帮助大家用好异常日志,或想使项目中规范使用,这篇文章也是为探讨这些的。
Java中日志(Log )和异常(Exception)是两项基本的功能。来到公司我也看了不少的现有代码,发现大家的使用方式是不太一样的,也存在一些明显的误用。
2.基础
使用例子
因为大家的开发习惯等不一样,所以异常日志的使用方式也会不一样,先和我一起看看典型例子吧。
例如:
3.异常日志在软件开发流程中的位置
异常是Java提供的异常的处理流程方式,但发生异常时Exception类的内部信息就是为了显示异常发生的来龙去脉了。所以Exception的各种属性信息一定要好好理解清楚。
Log就是记录日志、使用日志。现在我做的各种项目中用的最多的就是Log4j。日志有很多种用途,记录程序运行的错误肯定是最重要的。
下面我讲一下Log记录错误的原理。
Log中的记录错误可以分为:
非程序原因的错误(网络错误、用户输出入错)
程序原因的错误
已知的
可做简化处理
未知的
应该记录完备,不要丢失有用的信息。
4.Exception对象使用详解
Cause属性:用于存放内部异常对象信息
Throwable
getCause()
Throwable
initCause(Throwable cause)
StackTrace属性:用于存放异常对象建立时的运行堆栈信息(可以被修改)
StackTraceElement[]
getStackTrace()
void setStackTrace(StackTraceElement[] stackTrace)
强调一点,如果是因为捕获了异常而要抛出新的异常千万不要丢失内部异常信息(因为内部异常对象才是Root Cause)。有两种方式保存内部异常对象。
可以在创建异常对象时传入内部异常对象
Throwable(String message, Throwable cause)
Throwable(Throwable cause)
通过cause记录内部异常的异常打印效果
在创建新的异常后调后setStackTrace设置内部堆栈信息
无论哪种方式,只要内部异常堆栈没有丢失,就非常容易找到发生错误的代码。显示方式只是习惯问题。当然,最好在一个软件项目中可以制定规范,遵从某一种风格。
5.异常日志的输出流程
6.一些技巧
1. 对于已知不是程序内部错误的异常,可以不要打印错误信息。至少不要打印为了定位错误错误的异常堆栈的信息
例如:用户输入错误、已知的网络错误等
2. 对于大型软件(或访问量大)特别要注意日志的量(不要打的太多)。
3. 普通的调试日志还是在适当的时候删掉为好。
4. Log4j,在Dev环境让所有输出都定向到控制台,以方便查看。将下面文件放在类路径下。