您的位置:首页 > 编程语言 > Java开发

java自定义异常类以及全局log打印

2017-10-16 19:42 351 查看
import lombok.Data;

/**
* @author 01369526
*
*/
@Data
@SuppressWarnings("serial")
public class MyException extends RuntimeException implements Serializable{
private int errorcode;
public MyException(int errorcode,String message,Throwable throwable)
{
super(message,throwable);
this.errorcode=errorcode;
}

}


import java.util.ArrayList;
import java.util.List;

/**
* @author 01369526
*
*/
public class Test {
public void test(int a)
{
if (a==0) {
try {
List<Integer> list=new ArrayList<>();
list.add(666);
list.get(5);

} catch (Exception e) {
throw new MyException(666,"数组错误",e);
}

}}
}


*/
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
new Test().test(0);
}
catch (MyException exception) {
// TODO: handle exception
System.out.println(exception.getErrorcode()+"\n"+exception.getMessage()+"\n");
exception.printStackTrace();
}
}

}


输出:

666
数组错误

MyException(errorcode=666)
at exception.Test.test(Test.java:20)
at exception.Main.main(Main.java:15)
Caused by: java.lang.IndexOutOfBoundsException: Index: 5, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at exception.Test.test(Test.java:17)
... 1 more


全局异常统一处理方法:

定义异常类统一设置值方法

/**
* 异常时设置result值工具类
* @author 01369526
*
*/
public class ExceptionSetUtil {
/**
*
* @param result
* @param code 错误代码
* @param message 错误消息
* @param logger 日志
* @param exception
*/
public static  <T> void setErrorCodeAndMessage(Result<T> result,String code,String message,Logger logger,Throwable exception) {
logger.error(message,exception);
result.setErrorCode(code);
result.setErrorMessage(message);
}
}


自定异常类

import lombok.Data;

@Data
@SuppressWarnings("serial")
public class ZnfjRuntimeException extends RuntimeException{
String code;
public ZnfjRuntimeException(String code ,String message)
{
super(message);
this.code = code;
}

public ZnfjRuntimeException(Throwable cause) {
super(cause);
}

/**
* @Description:构造错误码,错误描述和错误堆栈
* @param code
* @param message
* @param cause
*/
public ZnfjRuntimeException(String code, String message, Throwable cause) {
super(cause instanceof ZnfjRuntimeException?cause.getMessage():message,cause);
if(cause instanceof ZnfjRuntimeException) {
this.code = ((ZnfjRuntimeException) cause).getCode();
}else {
this.code = code;
}
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}
}


设置AOP

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.sf.framework.domain.Result;

import dds.znfj.common.constant.ErrorCodeConstants;
import dds.znfj.common.exception.ZnfjRuntimeException;
import dds.znfj.common.utils.tdop.ExceptionSetUtil;

/**
* 统一日志处理类
*
* @author 01369526
*
*/
@Component
@Aspect
public class ServiceLogHandler {

private static final Logger logger = LoggerFactory.getLogger(ServiceLogHandler.class);

/*@Around("execution(* com.sf.tdop.*.service.impl.*.*.*(..))")*/

/*第一个*代表所有的返回值类型,第二个*代表所有的包,第三个代表所有的类,第四个*代表类所有方法,最后一个..代表所有的参数。*/
//@Around("execution(* com.sf.dds.znfj.container.service.impl.*.*.*(..))||execution(* com.sf.dds.znfj.task.service.impl.*.*.*(..))")
//  @Around("execution(* com.sf.dds.znfj.handover.service.impl.*.*.*(..))")
public Result<?> handleLog(ProceedingJoinPoint pjp) throws Throwable {
String name = pjp.getSignature().getName();
long startTime = System.currentTimeMillis();
logger.info("{}方法开始执行...", name);
Object[] args = pjp.getArgs();
for (Object obj : args) {
logger.debug("{}方法请求参数request:\n{\n{}\n}", name, obj);
}
Result<?> result = new Result<>();
try {
result = (Result<?>) pjp.proceed();
} catch (ZnfjRuntimeException e1) {
ExceptionSetUtil.setErrorCodeAndMessage(result, e1.getCode(), e1.getMessage(), logger, e1);
logger.error("error",e1);
return result;
}catch (Exception e) {
// TODO: handle exception
ExceptionSetUtil.setErrorCodeAndMessage(result,
ErrorCodeConstants.TdopCommonConstants.SYSTEM_ERROR_CODE,
ErrorCodeConstants.TdopCommonConstants.SYSTEM_ERROR_MESSAGE,
logger,
e);
logger.error("error",e);
return result;
}

long endTime = System.currentTimeMillis();
float time = (endTime - startTime) / 1000.0f;
logger.info("{}方法执行结束,耗时{}s", name, time);
logger.debug(
"{}方法返回结果response:\n{\n\"requestId\":{},\n\"success\":{},\n\"business\":{},\n\"errorCode\":{},\n\"errorMessage\":{},\n\"date\":{},\n\"version\":{},\n\"obj\":{}\n}",
name, result.getRequestId(), result.isSuccess(), result.getBusiness(), result.getErrorCode(),
result.getErrorMessage(), result.getDate(), result.getVersion(), result.getObj());
return result;
}

}


定义错误码:

public class ErrorCodeConstants {
private ErrorCodeConstants() {
}

/**
* @Description: SQL_EXCEPTION sql异常
*/
public static final String SQL_EXCEPTION      = "01";
/**
* @Description: IO_ERROR io异常
*/
public static final String IO_EXCEPTION       = "02";
/**
* @Description: SYSTEM_ERROR system异常
*/
public static final String SYSTEM_EXCEPTION   = "03";

/**
* @Description: SESSION_ERROR session异常
*/
public static final String SESSION_EXCEPTION   = "04";

/**
* @Description: CUSTOMER_EXCEPTION 自定义异常
*/
public static final String CUSTOMER_EXCEPTION  = "09";

/**
* @Description: DDS_ZNFJ_CORE_COMMON 公共基础模块
*/
public static final String DDS_ZNFJ_CORE_COMMON           = "101";
/**

/**
* @Description:公共基础模块
*/
public class TdopCommonConstants{
private TdopCommonConstants() {

}

public static final String INIT_SLICE_ERROR_CODE       = DDS_ZNFJ_CORE_COMMON + SQL_EXCEPTION + "001";
public static final String INIT_SLICE_ERROR_MESSAGE    = "初始化分片规则异常!";

public static final String SYSTEM_ERROR_CODE       = DDS_ZNFJ_CORE_COMMON + SYSTEM_EXCEPTION + "001";
public static final String SYSTEM_ERROR_MESSAGE    = "系统错误!";

}


最后加入扫描:

<context:component-scan base-package="dds.znfj" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: