package com.javaweb.common.utils.thread.exception; import com.javaweb.common.utils.thread.exception.util.ExceptionMessageFormat; import com.javaweb.common.utils.thread.exception.util.factory.ExceptionMsgFormatFactory; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 子线程异常,子线程出现异常时抛出 * @author zengyuanjun */ public class ChildThreadException extends Exception { /** * serialVersionUID */ private static final long serialVersionUID = 5682825039992529875L; /** * 子线程的异常列表 */ private List exceptionList; /** * 异常信息格式化工具 */ private ExceptionMessageFormat formatter; /** * 锁 */ private Lock lock; public ChildThreadException() { super(); initial(); } public ChildThreadException(String message) { super(message); initial(); } public ChildThreadException(String message, StackTraceElement[] stackTrace) { this(message); setStackTrace(stackTrace); } private void initial() { exceptionList = new ArrayList(); lock = new ReentrantLock(); formatter = ExceptionMsgFormatFactory.getInstance().getFormatter(ExceptionMsgFormatFactory.STACK_TRACE); } /** * 子线程是否有异常 * @return */ public boolean hasException() { return exceptionList.size() > 0; } /** * 添加子线程的异常 * @param e */ public void addException(Exception e) { try { lock.lock(); e.setStackTrace(e.getStackTrace()); exceptionList.add(e); } finally { lock.unlock(); } } /** * 获取子线程的异常列表 * @return */ public List getExceptionList() { return exceptionList; } /** * 清空子线程的异常列表 */ public void clearExceptionList() { exceptionList.clear(); } /** * 获取所有子线程异常的堆栈跟踪信息 * @return */ public String getAllStackTraceMessage() { StringBuffer sb = new StringBuffer(); for (Exception e : exceptionList) { sb.append(e.getClass().getName()); sb.append(": "); sb.append(e.getMessage()); sb.append("\n"); sb.append(formatter.formate(e)); } return sb.toString(); } /** * 打印所有子线程的异常的堆栈跟踪信息 */ public void printAllStackTrace() { printAllStackTrace(System.err); } /** * 打印所有子线程的异常的堆栈跟踪信息 * @param s */ public void printAllStackTrace(PrintStream s) { for (Exception e : exceptionList) { e.printStackTrace(s); } } }