关于LOG4J因为每个类中的catalog是不一样的。而且也不需要区别多用户的信息,应该可以满足现在的要求。
以下另:
通过自定义异常,来解决异常的覆盖问题。
并且也可以实现异常信息的自定义
文后说明了JAVA异常处理的几个注意点
自定义异常类:
通过重载getMessage方法,改写多个异常情况下异常信息输出。并且也可以在该方法中实现异常编码和异常信息的绑定:可以通过读取配置文件或者数据库,将异常编码转换为异常信息产生输出
package com.gever.jcw.test;
import java.util.List;
import java.util.ArrayList;
public class MyException extends Exception{
List list;
public MyException(){
super();
list=new ArrayList();
}
public MyException(ExceptionMsg msg){
super();
list=new ArrayList();
list.add(msg);
}
public void addException(ExceptionMsg msg){
list.add(msg);
}
public List getExceptionList(){
return list;
}
public String getMessage(){
StringBuffer sb=new StringBuffer();
if(list==null){
sb.append("nothing Exception!/n");
}else{
if(list.size()>0){
for(int i=0;i ExceptionMsg msg=(ExceptionMsg)list.get(i);
sb.append(msg.getClassname());
sb.append(".");
sb.append(msg.getMethodname());
sb.append(" ");
sb.append(msg.getLinenumber());
sb.append(" Line, ");
sb.append("wrong number ");
sb.append(msg.getErrnumber());
sb.append(":");
switch(msg.getErrnumber()){
case 101:
sb.append("this is 0 wrong");
break;
case 102:
sb.append("this is 1 wrong");
break;
case 103:
sb.append("this is 1 wrong");
break;
default:
sb.append("unknow error");
break;
}
sb.append("/n");
}
}
}
return sb.toString();
}
public void print(){
System.out.println(this.getMessage());
}
}
异常信息类:
package com.gever.jcw.test;
public class ExceptionMsg {
private int errnumber=0;
private String classname="";
private String methodname="";
private int linenumber=0;
public ExceptionMsg(int errnumber,String classname,String methodname,int linenumber){
this.errnumber=errnumber;
this.classname=classname;
this.methodname=methodname;
this.linenumber=linenumber;
}
public int getErrnumber() {
return errnumber;
}
public void setErrnumber(int errnumber) {
this.errnumber = errnumber;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getMethodname() {
return methodname;
}
public void setMethodname(String methodname) {
this.methodname = methodname;
}
public int getLinenumber() {
return linenumber;
}
public void setLinenumber(int linenumber) {
this.linenumber = linenumber;
}
}
测试类如下:
package com.gever.jcw.test;
public class TestT {
public void test() throws MyException{
MyException myex=new MyException();
try{
file://myex.addException();
throw new MyException(new ExceptionMsg(101,this.getClass().toString(),"test",14));
}catch(Exception e){
myex.addException(new ExceptionMsg(102,this.getClass().toString(),"test",16));
}finally{
myex.addException(new ExceptionMsg(103,this.getClass().toString(),"test",18));
throw myex;
}
}
public static void main(String[] args){
TestT test=new TestT();
try{
test.test();
}catch(MyException e){
e.print();
e.printStackTrace();
}
}
}
又一注意问题:finally会在return之前执行。如果try或者catch语句中,有return,并且有finally,那么该return语句将不会执行。
JAVA异常处理的几个注意点:
1)使用finally防止资源泄露
2)不用从try区块中执行return语句。如果该区块后有finally区块,则finally区块将首先执行
3)将try、catch区块置于循环体之外,因为在没有起用JIT编译器的情况下,两者执行效率差异显著
4)只有在异常情况下才去使用异常。不能够预计的才能叫异常;否则都应该用判断语句来进行校验
5)在构造函数中抛出异常。这样可以避免构造出不正确的对象
6)抛出异常前,如果可能,恢复对象的有效状态。