最近在做项目中异常处理部分,发现网上关于异常处理部分的介绍很少,自己对这东西也不是很熟悉,纯粹做一个整理。
我们在进行开发的时候,处理异常到时候经常是这样:
一般B/S系统的异常都要考虑客户端和服务端的异常处理。在发生异常的时候,我们常常希望:
在Silerlight RIA项目中,如果你想在服务端添加一个异常处理,可以重写DomainService的OnError方法:
protected override void OnError(DomainServiceErrorInfo LogInfo) { Logger.LogInfo(LogInfo.Error.Message); }
其中Logger为异常日志的封装类,日志记录使用的是log4net。我想大部分人都是用的log4net吧。没用过Enterpise Library for Silverlight的日志模块,我想两者应该差不多吧。
当你在客户端进行Load或者Invoke操作时,当操作失败的时候,在Load或Invoke操作失败的时候将会抛出异常。当你在客户端没有捕获这些异常信息的时候,将会触发应用程序的Application_UnhandledException事件。我们不能在Application_UnhandledException中处理所有的运行时异常
因为我们一般希望在客户端给客户友好的提示界面:如在DomainService有这样一个查询方法:
public IEnumerable<User> GetUsers() { }
客户端查询的时候就可以这样写:
RiaDomainContext.Load<User>(ds.GetUsersQuery(), loadOperation => { if (loadOperation.HasError) { MessageBox.Show(“查询用户信息时出错,请重新操作,如还有异常请联系管理员”); LogErrorToServer(loadOperation.Error)
loadOperation.MarkErrorAsHandled(); } } ,null);
在出现load操作失败的时候弹出用户异常信息,同时将错误发送个服务端,loadOperation.MarkErrorAsHandled() 这个方法的作用是告诉服务端,我这个异常已经处理了,你可以不用再管我了,所以在load或invoke操作的时候最好都加上这句话。LogErroToServer在服务端的写法:
[Invoke] public void LogException(string message, string stackTrace) { Logger.LogException(message, stackTrace); }
客户端可以通过LogErrorToServer调用LogException。同时也是使用log4net的东西。
关于log4net的东西,可以直接百度~