C#常见错误处理

C#常见错误处理,c#,try-catch,C#,Try Catch,我正在编写一个web服务,它是供应商web服务的包装器,并且有一系列相当详细的catch语句,用于调用供应商web服务方法。我正在处理两到三种类型的异常(System.Web.Services.Protocols.SoapException、System.ApplicationException、System.Exception…) 我刚刚意识到,它们的两个Create方法和Update方法之间的大多数错误是相同的 有没有聪明的方法可以跨多个方法共享完全相同的错误处理程序? 我开始只编写一个通用

我正在编写一个web服务,它是供应商web服务的包装器,并且有一系列相当详细的catch语句,用于调用供应商web服务方法。我正在处理两到三种类型的异常(System.Web.Services.Protocols.SoapException、System.ApplicationException、System.Exception…)

我刚刚意识到,它们的两个Create方法和Update方法之间的大多数错误是相同的

有没有聪明的方法可以跨多个方法共享完全相同的错误处理程序? 我开始只编写一个通用方法,但后来意识到我必须为正在处理的每种类型的异常编写至少一个通用方法。如果我能以完全相同的方式处理所有这些问题,那就太好了

这是一个具有已建立接口的web服务。当我写这篇文章时,我想我可以在web方法中放入尽可能少的代码,然后他们可以调用共享方法?只是想确保我没有错过一个明显的把戏

谢谢,
Neal

您可以创建一个接受委托的函数,然后使用lambda表达式(C#3)或匿名方法调用它。函数可以在try块中调用传入的委托并处理异常

private T CallWebService<T>(Func<T> function)
{
    try
    {
        return function();
    }
    catch (SoapException e)
    {
        // handle SoapException
    }
    catch (ApplicationException e)
    {
        // handle ApplicationException
    }
    // catch and handle other exceptions    
}

public ReturnType CallCreate(ParamType param)
{
    return CallWebService(() => WebService.InvokeCreate(param));
}

public ReturnType CallUpdate(ParamType param)
{
    return CallWebService(() => WebService.InvokeUpdate(param));
}

您可以使用Phil Ross的委托方法,也可以创建一个实现Invoke()方法的IWebMethodInvoker:

然后在类中为每个web方法调用实现此接口:

class CreateInvoker : IWebMethodInvoker
{
   public SomeDataType Data {get; set;}
   public SomeOtherType Results {get; set;}

   public void Invoke()
   {
       Results = YourWebServiceMethod(Data);
   }
}
然后,创建一个方法,该方法获取此接口的实例,调用它并执行错误处理:

public void ExecuteWebServiceCall(IWebMethodInvoker invoker)
{
    try
    {
        invoker.Invoke();
    }
    catch (ExceptionType1 e)
    {
        // Handle Exception Type 1
    }
    catch (ExceptionType2 e)
    {
        // Handle Exception Type 2
    } // etc
}
然后,调用web服务所需的全部内容如下:

var createInvoker = new CreateInvoker() { Data = someStuff };
ExecuteWebServiceCall(createInvoker);
var results = createInvoker.Results;

与委托方法相比,这种方法可能更具类型性,但对于经验不足的开发人员来说,可能更容易混淆。

明确处理不同类型的异常是否有实际价值。i、 是否有任何有效的用例需要处理ApplicationException中的SoapException。并没有时间的迷雾


如果您仍然认为有价值,我建议您使用中的ExceptionHandling应用程序块。在我看来,在这种情况下使用EnterpriseLibrary比在代码中添加许多catch块更干净、设计更好。

我不同意,这使它更复杂。很好的一点是,使用Sql Exception可以获得更多信息,但使用SoapException-我想我在那里没有看到任何有用的东西。
public void ExecuteWebServiceCall(IWebMethodInvoker invoker)
{
    try
    {
        invoker.Invoke();
    }
    catch (ExceptionType1 e)
    {
        // Handle Exception Type 1
    }
    catch (ExceptionType2 e)
    {
        // Handle Exception Type 2
    } // etc
}
var createInvoker = new CreateInvoker() { Data = someStuff };
ExecuteWebServiceCall(createInvoker);
var results = createInvoker.Results;