Silverlight RIA 异常处理以及异常日志_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Silverlight RIA 异常处理以及异常日志

Silverlight RIA 异常处理以及异常日志

 2013/8/28 22:57:29  anson_wang  博客园  我要评论(0)
  • 摘要:最近在做项目中异常处理部分,发现网上关于异常处理部分的介绍很少,自己对这东西也不是很熟悉,纯粹做一个整理。我们在进行开发的时候,处理异常到时候经常是这样:try之后直接throw了一个异常(...这个高手用的吧)try...catch了一个异常,但是catch里面什么都不错,毫无疑问会导致你连错的是什么都不知道不管什么都用Exception捕获(不应该捕获所有异常,因为有些异常是我们所无法预料到的,比如,内存溢出或其他错误,这种情况下,不应该让系统以一种未知状态继续运行
  • 标签:Silverlight RIA 异常处理 异常

最近在做项目中异常处理部分,发现网上关于异常处理部分的介绍很少,自己对这东西也不是很熟悉,纯粹做一个整理。

我们在进行开发的时候,处理异常到时候经常是这样:

  • try之后直接throw了一个异常(...这个高手用的吧)
  • try...catch了一个异常,但是catch里面什么都不错,毫无疑问会导致你连错的是什么都不知道
  • 不管什么都用Exception捕获(不应该捕获所有异常,因为有些异常是我们所无法预料到的,比如,内存溢出或其他错误,这种情况下,不应该让系统以一种未知状态继续运行)

一般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的东西,可以直接百度~

发表评论
用户名: 匿名