2009-09-25 6 views
0

Можно ли перехватывать исключения в одном месте в файле класса C#?C# класс обработки исключений

Я кодирую некоторые модульные тесты в NUnit, чтобы проверить веб-службу WCF, и на всех методах/тестах нужно уловить «EndpointNotFoundException» без необходимости кодировать это для каждого теста.

редактировать

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

Как я сделал что-то похожее на это в WCF с FaultException я был интересно знать, если это было возможно, в целом с классами C#

Но суть в том, что если это не удается, он терпит неудачу! благодаря @TrueWill для констатирую очевидное;) и @Abhijeet Патель заставила меня думать больше о том, как я структурировать блок тестирует

(о, и извинений за ответ на мой собственный вопрос;)

+1

Необработанное исключение в методе тестирования NUnit автоматически завершает тест. Разве это не то, что вы хотите? – TrueWill

+0

Вы хотите, чтобы ваши тесты потерпели неудачу, если исключение не выбрано? Или вы ищете простой способ сделать ваши тесты _not_ fail, если EndpointNotFoundException _is_ выбрано? –

ответ

2

Может быть, лучше будет ли поиск кода обработки исключений с помощью AOP (postharp) или инъекции политики?

AFAIK, то, что вы пытаетесь сделать, невозможно. Вы можете изучить Application.ThreadException и AppDomain.CurrentDomain.UnhandledException для централизованной обработки исключений.

0

Вам необходимо создать механизм регистрации (или использовать стороннюю реализацию, такую ​​как log4net), и вставить блоки блокировки везде, где регистрируются исключения. Другими словами, нет.

1

Аспект-ориентированное программирование может быть сделано для обработки одного типа исключения, как EndpointNotFoundException..and исключение может быть зарегистрирован где-то с помощью этого ..

3

В общем, нет - вы можете только поймать на месте. Есть изолированные исключений случаев, когда вы можете это сделать - ASP.NET MVC-контроллеры и WCF услуги - два примера, которые бросаются в глаза, где можно легко справиться с обработкой ошибок (или легко ).

Но в вашем случае - не хотите ли вы добавить [ExpectedException(...)] к затронутым тестам?

+0

Или поочередно Assert.Throws/DoesNotThrow для NUnit 2.5: http://www.nunit.org/index.php?p=exceptionAsserts&r=2.5.2 – TrueWill

0

Как уже указывал Марк, использование [ExpectedException] в модульном тесте представляется наиболее логичным способом особенно для модульных тестов, где вы хотите сосредоточиться на единице функциональности. если вы делаете много попыток ... обработка стиля уловов и условная проверка, то ваш единичный тест на самом деле не является единичным тестом

2

Для достижения этой цели вы можете использовать AOP. Идея заключается в том, что, как вы просите, приложить некоторое поведение (обработка исключений в этом случае) ко всем методам в классе.

Например, с помощью PostSharp, вы можете определить следующий «обработчик исключений»:

[Serializable] 
class EndpointNotFoundExceptionHandlerAspect : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionEventArgs eventArgs) 
    { 
     if (eventArgs.Exception is EndpointNotFoundException) 
      eventArgs.FlowBehavior = FlowBehavior.Continue; // continue without throwing an exception 
     else 
      base.OnException(eventArgs); 
    } 
} 

Затем добавьте EndpointNotFoundExceptionHandlerAspect в определении вашего класса. Затем каждый раз, когда вызывается EndpointNotFoundException, он будет «обрабатываться».

Примечание: Я не утверждаю, что это хорошая идея. Это всего лишь пример , так как это может быть достигнуто.

0

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

private void InvokeAction (Action<TData> action, data) 
{ 
    try 
    { 
     action(data); 
    } 
    catch (EndpointNotFoundException enfe) 
    { 
     .... unified handling here 
    } 
    catch (OtherExceptionType oet) 
    { 
    } 
} 

Используя этот подход, то вы можете сделать вызов ваших метод обслуживания, которые все будут иметь тот же самый вызов try catch catch.

например. InvokeAction(AddUser, userData);

например. InvokeAction(UpdateUser, userData);

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