JAVA异常处理原则和log4j输出详细异常分析

1.多用try,catch;不要一个try,catch包含所有内容

好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行

2.多写几个catche;尽量不要使用Exception这个大异常去包容所有异常

不要为了追求代码的简练,try,catch只写一个,使用Exception去抓取所有可能的异常,这只是理想状态,程序出错不是直接打印出来异常就完事了,应该在catche抓取异常的同时一方面给程序员输出错误日志,一方面做些处理反馈给用户,比如一些提示错误框或者错误页面,不能让用户不知道所以然但是系统没有正常进行。

综上所述,应该多使用几个catche块去抓取不同异常,然后做不同处理,返回给用户,尽量不同异常使用不同cacht块抓取别一个Exception抓取所有异常;

3.通过测试来谈谈java常见异常打印的区别

packagecom.hudong.test;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

public class TryCatchTest{

private final static Log logger =LogFactory.getLog(TryCatchTest.class);

public static void main(String[] args) {

try {

System.out.println(1 / 0);

} catch (Exception e) {

logger.error("---fill---:" +e.fillInStackTrace());

logger.error("----------美丽的分割线---------");

logger.error("---msg---:"+ e.getMessage());

logger.error("----------美丽的分割线---------");

logger.error("---e---:" +e.toString());

logger.error("---e===e---:"+ e);

System.out.println("===============");

System.out.println(e.toString());

System.out.println("--------------------");

System.out.println(e.getMessage());

System.out.println("--------------------");

e.printStackTrace();

System.out.println("--------------------");

System.out.println("---fill---:"+e.fillInStackTrace());

System.out.println("===============");

}

try {

System.out.println(1 / 0);

} catch (Exception e) {

try {

throw e;

// throw e.fillInStackTrace();

} catch (Throwable e1) {

e1.printStackTrace();

}

}

}

}

关于java异常的打印网上有很多资料,关于log4j日志的异常输出也有很多资料;但是今天突然想到一个问题:几种异常打印的区别,以及哪种可以打印出详细的异常轨迹 和指定错误行;网上却没找到确切的说法和资料;所以自己写了个测试小程序,通过查资料确认得出以下结论:

1.上面案例的测试只有两种情况可以打印出详细错误堆栈信息:

logger.error("---e===e---:"+ e);

throw e;

第一种是log4j定义的error(message,e)方法实现的打印详细信息;第二种是java自带的抛出详细异常的方式;经过测试只有这两种可以打印出详细的堆栈轨印,其他方式都只输出错误信息。

2. throw e与throwe.fillInStackTrace()的区别

前者输出了详细的错误代码行;后者只输出抛出异常的位置,并未打印出错误代码行的位置,即e.fillInStackTrace()所在地额代码行;所以相对来说,如果想要清楚的抛出错误信息应该使用前者。

3.logger.error("---e===e---:" + e)与logger.error("---fill---:" +e.fillInStackTrace())的区别;

throw、throwe.fillInStackTrace()两个都可以打印出详细异常,与不同的是,log4j前者方式打印的出详细异常并指向错误代码行,而后者不会打印详细堆栈。

4.fillInStackTrace输出信息查看

如果调用e.fillInStackTrace() ,表示重新填充stack里面的信息,那就会丢失低s一级环境的违例对象的信息。如果重新new 一个违例也丢失低一级的违例对象的信息。

时间: 2024-11-04 22:01:25

JAVA异常处理原则和log4j输出详细异常分析的相关文章

shell 脚本 变量 获取程序输出结果异常分析

#! /bin/bash pid=$(pgrep hello) echo ${pid} 脚本名称是 hello_test.sh 当hello进程存在时,总是返回两个值 当hello进程不存在时,返回值并不为空,总是返回一个值,多次运行,返回的值并不固定 当然,以上都不是期望的结果. 为什么不存在时,也会返回呢,并且返回值不一样,记得好像有一个内部变量记得上次shell进程的pid, 应该是这样. 经人提醒,脚本是不是也是hello.sh,终于恍然醒悟,脚本名是hello_test.sh,也包含h

java异常处理(父子异常的处理)

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习<Thinking in Java>,我才明白其中的道理,现在我再来温习一下. 一.子类方法只能抛出父类方法的异常或者是其子异常 对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常 package thinkinginjava; public abst

Java异常处理机制难点解惑-用代码说话

是否需要看这篇文章? 下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerException)返回值多少? 如果你了解这个例子说明的问题,并了解例子中三种情况下的执行细节,这篇文章你就不用浪费时间看了. 例子: public int testException_finally(){ int x; try { x = 1; //int y = 1/0; //放开此处,出现Ar

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其用不弊.大盈若冲,其用不穷.  <道德经-老子>最完满的东西,好似有残缺一样,但它的作用永远不会衰竭:最充盈的东西,好似是空虚一样,但是它的作用是不会穷尽的 Written In The Font 摘要: 异常处理概述 学习内容: 建议110: 提倡异常封装 建议111: 采用异常链传递异常 建议

Java异常处理 “受控(checked)”的异常

示例程序: public class TestThrows { public static void main(String[] args) { FileInputStream fis = new FileInputStream("a.txt"); } } 为什么以上程序完全符合Java语法规范,但是却会报错呢? 修正: public class TestThrows { public static void main(String[] args) throws FileNotFoun

程序有异常不知道咋办?来学习Java异常处理知识点和异常链机制

Java异常处理知识点和异常链机制异常处理是程序设计中一个非常重要的方面,毕竟人无完人,不可能永不犯错,程序中有异常是很正常的, Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,下面是我对Java异常知识和异常链的一个总结.一.Java异常的基础知识异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.有些异常需要做处理,有些则不需要捕获处理,在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免.不可预测的情况则在考虑异常发生时如何处理.J

基础知识《十一》Java异常处理总结

Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟

Java异常处理总结Exception\Error

Java异常处理总结Exception\Error 2012-12-28 08:17:17|  分类: JAVA |  标签:java  |举报|字号 订阅 Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,

Java提高篇——Java 异常处理

异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用户错误