Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理未处理的异常_C#_Exception_Exception Handling - Fatal编程技术网

C# 处理未处理的异常

C# 处理未处理的异常,c#,exception,exception-handling,C#,Exception,Exception Handling,我有一个Ria服务来调用逻辑代码。我想在每个逻辑函数中编写try-catch块,以提供处理未处理异常的方法 try { //something } catch(BussinessException e) { //save e.info to database } 但是我不想在逻辑中的任何地方都写这个块代码,我也不想把异常处理部分放在RIA服务中,因为另一种类型的服务也调用这个逻辑 有谁能为我提供一个单一位置的异常处理解决方案吗?根据您的历史记录,我很确定这是C#,所以我的观点如下 避免重复的最

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

try
{
//something
}
catch(BussinessException e)
{
//save e.info to database
}
但是我不想在逻辑中的任何地方都写这个块代码,我也不想把异常处理部分放在RIA服务中,因为另一种类型的服务也调用这个逻辑


有谁能为我提供一个单一位置的异常处理解决方案吗?

根据您的历史记录,我很确定这是C#,所以我的观点如下

避免重复的最好方法是这样包装您的逻辑

private static void ExecuteLogic(Action action)
{
    try
    {
        action();
    }
    catch(BussinessException e)
    {
        //save e.info to database
    }
}
有了它,您可以轻松地执行共享相同错误处理的各种操作

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

如果您只想记录异常,正如我从您的示例中看到的,您可以订阅。但你无法处理它。哦顺便说一句,此事件仅在.NET 4中介绍:(.

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

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));
  }
}

实现一个IHttpModule

web.config:

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

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

。想问一个聪明的人。你能为类似的东西扩展IDispose吗?好主意坏主意?@Kieran-我相信你可以用无数种方式扩展IDispose。你能告诉我最终的目标是什么吗l你会想要吗?太好了!这很方便,也适合我们愚蠢的静态逻辑类。嘿,伙计。谢谢你的回答。我已经对idisposable进行了更多的研究,但它不像我最初认为的那样适用于此…这是我过去会使用的一种强大方法,但我的代码已经转向了更功能化的风格。这是一个伟大的依赖注入解决方案!
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*/
        }
    }
}