C#常见错误处理

Nea*_*ers 3 c# try-catch

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

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

是否有任何聪明的方法可以跨多个方法共享完全相同的错误处理程序?我开始只编写一个常用方法,但后来意识到我必须为我正在处理的每种类型的异常编写至少一个常用方法.如果我能以完全相同的方式处理所有这些,那将是很棒的.

这是一个具有已建立接口的Web服务.在我写这篇文章时大声思考,我想我可以在web方法中尽可能少地编写代码,然后他们可以调用共享方法?只是想确保我没有错过一个明显的伎俩.

谢谢,尼尔

Phi*_*oss 11

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

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));
}
Run Code Online (Sandbox Code Playgroud)

如果各个方法需要处理自己的特定异常,那么可以将其添加到CallCreateCallUpdate方法中.

上面的示例使用lambda表达式.相当于CallCreate使用匿名方法是:

public ReturnType CallCreate(ParamType param)
{
    return CallWebService<ReturnType>(delegate()
    { 
        return WebService.InvokeCreate(param) 
    });
}
Run Code Online (Sandbox Code Playgroud)