package com.ycsoft.commons.exception;
import java.sql.SQLException;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.commons.pojo.ExceptionData;
public class ExceptionMessage {
public static ExceptionData getMsgFromException(Exception ex) {
// 业务异常的处理
if (ServicesException.class.isInstance(ex)||ComponentException.class.isInstance(ex)) {
return msgFromService(ex);
}
else if (LoginException.class.isInstance(ex)) {
return msgFromLogin(ex);
}else if(ReportException.class.isInstance(ex)){
//报表系统错误
return msgFromReport((ReportException)ex);
}
//其他系统异常
else
return msgFromException(ex);
}
// 对于登录超时的处理
private static ExceptionData msgFromLogin(Exception ex) {
ExceptionData msg = new ExceptionData();
msg.setType(ExceptionData.LOGIN_EXCEPTION);
msg.setTitle(ExceptionData.TITLE_EXCEPTION);
msg.setContent(ex.getMessage());
return msg;
}
// 对于业务异常消息的处理
private static ExceptionData msgFromService(Exception ex) {
ExceptionData msg = new ExceptionData();
msg.setType(ExceptionData.EXCEPTION);
msg.setTitle(ExceptionData.TITLE_EXCEPTION);
msg.setContent(ex.getMessage());
return msg;
}
//报表系统异常消息的处理
private static ExceptionData msgFromReport(ReportException ex){
ExceptionData msg = new ExceptionData();
msg.setType(ExceptionData.REPORT_EXCEPTION);
msg.setTitle(ExceptionData.TITLE_EXCEPTION);
msg.setContent(ex.getMessage());
if(StringHelper.isEmpty(ex.getSql())&&!ex.isPrompt_sign()){
StackTraceElement[] trace = ex.getStackTrace();
StringBuilder buffer = new StringBuilder();
Throwable e_message=ex.getCause();
if(e_message!=null)
buffer.append("\n\tat").append(e_message.getClass().getName()).append(":").append(e_message.getMessage());
while(e_message!=null&&e_message.getCause()!=null){
e_message=e_message.getCause();
buffer.append("\n\tat").append(e_message.getClass().getName()).append(":").append(e_message.getMessage());
}
for (StackTraceElement element : trace)
buffer.append("\n\tat ").append(element);
// 异常堆栈 信息结束 同时设置异常堆栈
msg.setDetail(buffer.toString());
}else
msg.setDetail(ex.getSql());
return msg;
}
// 对于其他异常消息 作为错误信息处理 包括向客户端输送 堆栈信息
private static ExceptionData msgFromException(Exception ex) {
ExceptionData msg = new ExceptionData();
msg.setType(ExceptionData.ERROR);
msg.setTitle(ExceptionData.TITLE_ERROR);
// 异常堆栈 信息开始
StackTraceElement[] trace = ex.getStackTrace();
StringBuffer buffer = new StringBuffer();
for (StackTraceElement element : trace)
buffer.append("\n\tat " + element);
// 异常堆栈 信息结束 同时设置异常堆栈
msg.setDetail(buffer.toString());
if (null != ex.getMessage())
msg.setContent(ex.getMessage());
else
msg.setContent(ex.toString());
return msg;
}
/* private static ExceptionData msgFromDbException(Exception ex) {
SQLException sqlEx = getSqlExFromEx(ex);
if (sqlEx == null)
return msgFromService(new ServicesException("空异常"));
//需要继续扩展
//.....
else if (ConnectException.class.isInstance(sqlEx.getCause()))
return msgFromService(new ServicesException(
"数据库连接异常: \n 请检查数据库连接或配置!"));
else
return msgFromException((Exception) sqlEx.getCause());
}*/
private static SQLException getSqlExFromEx(Exception ex) {
SQLException sqlEx = null;
Throwable cause = ex.getCause();
while (null != cause) {
if (SQLException.class.isInstance(cause))
return (SQLException) cause;
cause = cause.getCause();
}
return sqlEx;
}
}