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

1.多用try,catch;不要一个try,catch包含全部内容java

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

2.多写几个catche;尽可能不要使用Exception这个大异常去包容全部异常apache

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

综上所述,应该多使用几个catche块去抓取不一样异常,而后作不一样处理,返回给用户,尽可能不一样异常使用不一样cacht块抓取别一个Exception抓取全部异常;测试

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

packagecom.hudong.test;对象

importorg.apache.commons.logging.Log;get

importorg.apache.commons.logging.LogFactory;io

public class TryCatchTest{class

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 一个违例也丢失低一级的违例对象的信息。

相关文章
相关标签/搜索