2009-12-08 2 views
3

Я пишу веб-сервис, который является оберткой для веб-службы поставщика, и имеет довольно подробную серию операторов catch для вызова методов веб-сервисов поставщиков. У меня есть два или три типа исключений, которые я обрабатываю (System.Web.Services.Protocols.SoapException, System.ApplicationException, System.Exception ...)C# общая обработка ошибок

Я просто понял, что большинство ошибок одинаковы между их двумя методами Create и их методом Update.

Есть ли какой-либо умный способ разделить одни и те же обработчики ошибок по нескольким методам? Я начал писать только обычный метод, но потом понял, что мне придется писать хотя бы один общий метод для каждого типа исключения, которое я обрабатываю. Было бы здорово, если бы я мог справиться с ними точно так же.

Это веб-сервис с установленным интерфейсом. Просто размышляя вслух, когда я пишу это, я думаю, что я мог бы поместить как можно меньше кода в веб-методы, а затем они могли бы назвать общий метод? Просто хочу убедиться, что я не упускаю очевидный трюк.

Спасибо, Нил

ответ

10

Вы можете создать функцию, которая принимает делегат, а затем вызвать его с помощью лямбда-выражения (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)); 
} 

Если отдельные методы нуждаются в их собственные конкретные исключения обрабатывались, то это может быть добавлено к CallCreate и CallUpdate методов.

В приведенном выше примере используются лямбда-выражения. Эквивалент CallCreate с помощью анонимных методов:

public ReturnType CallCreate(ParamType param) 
{ 
    return CallWebService<ReturnType>(delegate() 
    { 
     return WebService.InvokeCreate(param) 
    }); 
} 
+1

+1 - Это путь. – ChaosPandion

1

Вы можете использовать делегат подход Фила Росса, или в качестве альтернативы, вы можете создать IWebMethodInvoker, который реализует метод Invoke():

interface IWebMethodInvoker 
{ 
    void Invoke(); 
} 

Тогда вы реализуете этот интерфейс в классе для каждого вызова веб-метода:

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 
} 

Тогда все, что вам нужно для вызова веб-сервиса заключается в следующем:

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

Это может быть немного более типирование, чем делегат подход, но, возможно, менее запутанным менее опытных разработчиков.

+0

Я не согласен, это усложняет ситуацию. – ChaosPandion

1

Есть ли реальная ценность при обращении с различными типами исключений явно. т. е. существует ли какой-либо допустимый прецедент, который должен обрабатывать SoapException из исключения ApplicationException. Тумана того времени нет.

Если вы все еще думаете, что есть значение, я бы предложил использовать блок приложения ExceptionHandling из Enterprise Library. Использование EnterpriseLibrary в этом сценарии более чище и лучше, на мой взгляд, чем надуть ваш код множеством блоков catch.

+0

Хорошо, с Sql Exception вы получаете больше информации, но с SoapException - я не видел ничего полезного там, я думаю. – NealWalters

Смежные вопросы