

package com.base;

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;

import org.apache.log4j.Logger;

import com.platform.utils.Bean2MapUtils;
import com.platform.utils.Configs;
import com.platform.utils.Constant;

/**
 * <一句话功能简述>
 * <功能详细描述>
 * @author    chen
 * @version   [版本号，2016年9月8日]
 * @see       [相关类/方法]
 * @since     [产品/模块版本]
 */
@SuppressWarnings("serial")
public class CustomException extends Exception {
	
	/** log4j  */
	@SuppressWarnings("static-access")
	public static Logger log = Configs.DAILY_ROLLING_LOGGER.getLogger(CustomException.class);
	
	/** 自定义异常信息-错误信息  */
	private String msg;
	
	/** 自定义异常信息-错误代码  */
	private String code;
	
	/** 操作对象  */
	private Object[] objArray;
	
	/** 异常  */
	private Throwable cause;
	
	public CustomException() {
	        super();
    }
	 
	/**
	 * @功能 将异常记录进文件
	 * @param code 异常编码
	 * @param msg 自定义异常信息
	 * @param e
	 * @param obj
	 */
	public CustomException(String code,Exception e,Object... obj) {
//		super(code);
		StringBuffer sbuf= new StringBuffer();
		this.code = code;
		sbuf.append(code);
		sbuf.append("\r\n");
		msg = Resource.getProperties().get(code);
		// 记录自定义的 异常
		if (null != msg) {
			sbuf.append(msg);
			sbuf.append("\r\n");
		}
		// 记录原始的异常
		if (null != e) {
			sbuf.append(e.getMessage());
			sbuf.append("\r\n");
			StackTraceElement[] array = e.getStackTrace();
			cause = e.getCause();
			for (StackTraceElement stackTraceElement : array) {
				sbuf.append(stackTraceElement.toString());
				sbuf.append("\r\n");
			}
		}
		//记录  出现异常时  当前的对象
		if (null != obj) {
			Object[] array = obj;
			sbuf.append("Object[] size :  ");
			sbuf.append(array.length);
			sbuf.append("\r\n");
			int forSize = 0;
			if (Constant.CustomException_log_object_size < array.length) {
				forSize = Constant.CustomException_log_object_size;
			}
			else {
				forSize = array.length;
			}
			for (int i = 0; i < forSize; i++) {
				sbuf.append(array[i]);
				sbuf.append("\r\n");
				try {
					sbuf.append(Bean2MapUtils.convertBean(array[i]));
					sbuf.append("\r\n");
				} catch (IllegalAccessException | InvocationTargetException
						| IntrospectionException e1) {
				}
			}
			if (forSize == Constant.CustomException_log_object_size) {
				sbuf.append("......");
				sbuf.append("\r\n");
			}
		}
		else {
			sbuf.append("null");
			sbuf.append("\r\n");
		}
		
		sbuf.append("\r\n");
		// 是否 写入 文件
		log.error(sbuf.toString());
	}

	/**
	 * @功能  获得msg
	 * @return msg
	 */
	public String getMsg() {
		return msg;
	}
	

	/**
	 * @return the code
	 */
	public String getCode() {
		return code;
	}

	/**
	 * @功能  获得objArray
	 * @return objArray
	 */
	public Object[] getObjArray() {
		return objArray;
	}

	/**
	 * @功能  获得cause
	 * @return cause
	 */
	public Throwable getCause() {
		return cause;
	}
}

