今天在弄dwr的异常处理,想把java后台的异常信息,在浏览器展示出来,原来没处理这块,导致dwr一直报Error错误,也不知道是什么错,需要后台翻日志,现在改造了一下,终于把异常的堆栈信息加载到前台了。
Dwr在异常处理的时候,有很多种方式,全局的方式,部分函数的方式,具体的写法Dwr的官方网站上有说(http://directwebremoting.org/dwr/documentation/browser/errors.html),这里就不介绍了。
我这里用的是全局的方法,机配置一个全局的异常处理函数。如果java后台不做处理的话,那么Dwr的全局函数,只能显示你在Exception里写的消息,不在Exception里的消息,是无法显示出来的,这就对我们排错造成困难。
因此我对后台的异常信息作了处理,让java抛出的异常信息都记录下来
代码如下(客户端):
function errorHander(msg,ex){ if(QH_LOADMASK){ QH_LOADMASK.hide(); } var errorMsg = "系统堆栈:\n"+msg; var stackMsg = ""; var programMsg = '程序堆栈:\n--------------------------------------------------------------------\n'; var continueCount = 0; for(var j=0; j<ex.stackTrace.length; j++){ var obj = ex.stackTrace[j]; stackMsg += " at "+ obj.className+"."+obj.methodName+"("+obj.fileName+" "+obj.lineNumber+")\n"; } if(stackMsg != ""){ Ext.Msg.show({ title:'错误堆栈', //msg:"", //defaultTextHeight:500, width :900, icon:Ext.Msg.ERROR, buttons:Ext.Msg.OK, prompt:true, multiline:450, value:errorMsg+"\n"+programMsg +stackMsg, maxWidth:900 }); } } //配置DWR异常处理的全局处理函数 DWREngine.setErrorHandler(errorHander);
服务端:
public int saveOrUpdateRecords(List records) throws DAOException {
try {
return (Integer)super.getHibernateTemplate().execute(new BatchSoUCallback(records));
} catch (DataAccessException ex) {
String msg = ExceptionStackTracePaser.paserStactTrace(ex);
throw new DAOException("DataAccessException:" + msg);
}
}
public class ExceptionStackTracePaser {
/**
* 描述:解析异常信息的堆栈信息,并将其转换为字符串
* @param ex
* @return
* 返回值:String
*/
public static final String paserStactTrace(Exception ex){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(outputStream);
ex.printStackTrace(stream);
return ex.getMessage()+"\r\n"+outputStream.toString();
}
}
这样在前台就可以抓住其他部分的异常信息了。
注:ByteArrayOutputStream 用的是apache commons 的io包里面的类