Dwr异常处理

今天在弄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包里面的类

你可能感兴趣的:(apache,浏览器,ext,DWR,J#)