处理未处理的异常

时间:2010-10-05 02:15:10

标签: c# exception exception-handling

我有一个Ria服务来调用逻辑代码。我想在每个逻辑函数中编写try catch块,以提供处理非常规异常的方法。

try
{
//something
}
catch(BussinessException e)
{
//save e.info to database
}

但我不想在我的逻辑中到处编写这个块代码,并且我不想将异常处理部分放在RIA服务中,因为另一种类型的服务也会调用逻辑。

是否有人为我提供一个单一的异常处理解决方案?

4 个答案:

答案 0 :(得分:2)

基于你的历史,我很确定这是C#所以这是我的看法。

避免重复的最好方法是将这样的逻辑包装起来。

private static void ExecuteLogic(Action action)
{
    try
    {
        action();
    }
    catch(BussinessException e)
    {
        //save e.info to database
    }
}

有了这个,您可以轻松执行共享相同错误处理的各种操作。

ExecuteLogic(
    () =>
    {
        // Do something...
    }
);

答案 1 :(得分:0)

如果您只想记录异常,我可以从您的示例中看到,您可以订阅AppDomain.FirstChanceException。但是你无法处理它。哦。顺便说一句,这个事件只在.NET 4中引入:(。

答案 2 :(得分:0)

这是一个使用命令模式的更传统的面向对象解决方案。

public interface ICommand {
  void Execute();
}

public class BankAccountWebServiceCall: ICommand(){

  string name;
  int accountNo;

  public BankAccountWebServiceCall(string name, int accountNo) {
    this.name= param1;
    this.accountNo= accountNo;
  }

  //ICommand implementation
  public void Execute() {
    SomeWebService.Call(name, accountNo);
  }
}

public class WebServiceCaller {
  public void CallService(ICommand command) {
    try {
      command.Execute();
    } catch (SomeBusinessException ex) {
      //handle exception
    }
  }
}

public class WebServiceCallerTest {
  public static void CallServiceTest() {
    new WebServerCaller().CallService(new TwoParameterwebServiceCall("Igor", 12345));
  }
}

答案 3 :(得分:0)

实施IHttpModule

的web.config:

<httpModules>
    ...
    <add type="Citiport.Web.Module.ErrorHandleModule" name="GlobalErrorHandler" />
    ...
</httpModules>

班级:

public class ErrorHandleModule : IHttpModule
    {

        private static readonly ILog logger = LogManager.GetLogger("Citiport.Web.Module.ErrorHandleModule");

        public ErrorHandleModule()
        {

        }

        void IHttpModule.Dispose()
        {
        }

        void IHttpModule.Init(HttpApplication context)
        {
            context.Error += new System.EventHandler(onError);
        }

        public void onError(object obj, EventArgs args)
        {
            HttpContext ctx = HttpContext.Current;
            HttpResponse response = ctx.Response;
            HttpRequest request = ctx.Request;

            Exception exception = ctx.Server.GetLastError();
            /* handling exception here*/
        }
    }
}

参阅:HTTP://code.google.com/p/citiport2/source/browse/trunk/CitiportV2_website/App_Code/Web/ErrorHandleModule.cs