2015-06-25 5 views
2

У меня есть кода обработки исключений в каждом методе кода ниже для методов нижних уровнейХорошая практика шаблона дизайна для обработки исключений

throw new Exception("The error that happens"); 

Есть ли способ, что я могу не писать этот код снова и снова в каждом методе ?

Я пытаюсь написать свой собственный код, а не с помощью каких-либо журнал каркасов

private void TopLevelMethod() 
{ 
    try 
    { 
     SomeMethod(); 
    } 
    catch (Exception ex) 
    { 
     // Log/report exception/display to user etc. 
    } 
} 

private void SomeMethod() 
{ 
    TestPartA(); 
    TestPartB(); 
    TestPartC(); 
    TestPartD(); 
} 

private void TestPartA() 
{ 
    // Do some testing... 
    try 
    { 
     if (somethingBadHappens) 
     { 
      throw new Exception("The error that happens"); 
     } 
    } 
    catch (Exception) 
    { 
     // Cleanup here. If no cleanup is possible, 
     // do not catch the exception here, i.e., 
     // try...catch would not be necessary in this method. 

     // Re-throw the original exception. 
     throw; 
    } 
} 

private void TestPartB() 
{ 
    // No need for try...catch because we can't do any cleanup for this method. 
    if (somethingshappens) 
    { 
     throw new Exception("The error that happens"); 
    } 
} 
+0

Знаете ли вы разницу между «броском и броском нового», посмотрите здесь, а также выполните некоторые поисковые запросы по адресу http://stackoverflow.com/questions/2999298/difference-between-throw-and-throw-new-exception – MethodMan

+0

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

+0

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

ответ

1

поймать только ошибки, если вы хотите сделать что-то значимое для них таких, как:

  1. Обертывания исключения с рамочным исключением (например, SqlException. ADO.NET никогда не передает вам ошибки на уровне сокета. Она проходит вам содержательную SQL код ошибки)
  2. Cleanup
  3. На самом деле реагируют (например, повторите попытку, либо вставить значения по умолчанию)

Logging почти никогда не подходит. Обработчик верхнего уровня должен регистрироваться. Конечно, не каждый метод в пути должен регистрироваться. Что за беспорядок для журналов и для кода. Не делай этого.

Просто не проглатывайте информацию об ошибке и не допускайте появления ошибки. Таким образом, нет причин оставлять локальный код регистрации для ошибок во всем мире.

1

Если вы предпочитаете использовать функциональное программирование как стиль кода один способ заключается в использовании функции обратного вызова ошибки обратного вызова. Пример:

private void SomeMethod() 
    { 
     // do something 
    } 
    public bool Execute(Action act, Action<Exception> onErrorCallback) 
     { 
      var res = true; 
      try 
      { 
       act(); 
      } 
      catch (Exception ex) 
      { 
       res = false; 
       onErrorCallback(ex); 
      } 
      return res; 
     } 

И использовать Execute так:

var successfull = true; 
    successfull &= Execute(SomeMethod, (ex) => { /* clean up */ }); 
    successfull &= Execute(SomeMethod, (ex) => { /* clean up */ }); 
    successfull &= Execute(SomeMethod, (ex) => { /* clean up */ }); 
    successfull &= Execute(SomeMethod, (ex) => { /* clean up */ }); 
    if (!successfull) 
     ; // show user or something else 
+0

Вы только что представили то, что большинство больше всего ненавидит JavaScript на C#. Обратные вызовы для передачи результатов. – usr

+0

Кроме того, вы добавили 'ON ERROR RESUME NEXT' :) – usr

0

Graffito: могли бы вы дать пример кода example.Thankyou ...

Ваш код переработан:

private void TopLevelMethod() 
{ 
    List<string> errors=new List<string>() ; 
    if (!SomeMethod(errors)) { /* Log/report errors/display to user etc. */ } 
} 

private bool SomeMethod(List<string> errors) 
{ 
    return TestPartA(errors) && TestPartB(errors) && TestPartC(errors) && TestPartD(errors); 
} 

private bool TestPartA(List<string> errors) 
{ 
    bool result = true ; 
    try 
    { 
    // Do some testing... 
    if (somethingBadHappens) { result=false; errors.Add("The error that happens"); } 
    } 
    catch (Exception ex) { errors.Add("Error in TestPartA: "+Ex.Exception.Message.ToString()) ; } 
    return result ; 
} 

private bool TestPartB(List<string> errors) 
{ 
    bool result = true ; 
    // Do some testing... 
    if (somethingBadHappens) { result = false ; errors.Add("The error that happens"); } 
    return result ; 
} 
+1

Преобразование исключения в возвращаемые значения теряет преимущества, которые приносят исключения. Кроме того, все методы в этом фрагменте кода зависят и мутируют общее состояние (список), что является еще одним недостатком. Я бы отказался от этого в обзоре кода. – usr

+0

** usr ** сказал: «Исключение исключений из возвращаемых значений теряет преимущества, которые исключают приносить». Для многих исключений возвращаемые значения являются подходящими (например, отказ от записи в файле). Следует исключить некоторые исключения (например, обнаружение ненормальных данных, предоставленных предыдущей процедурой). Также обратите внимание, что обработка исключений выполняется медленно. Например, критерий «b = int.tryParse (s, out i) vs« try {i = int.Parse (s); } поймать {}". – Graffito

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