2017-01-25 2 views
1

В настоящее время я работаю с некоторым кодом, который используется в связи с клиентским сервером.Какие проблемы вы видите при обработке исключений для одного метода?

Я очень много (около 50) из следующих блоков try-catch

try 
{ 
    return GetLogFiles(date); 
} 
catch (TimeoutException ex) 
{ 
    this.GetLogger("GetAllLogs").Error("C is not answering!", ex); 
} 
catch (ConnectionInterruptedException ex) 
{ 
    this.GetLogger("GetAllLogs").Error("Connection interrupted", ex); 
} 
catch (ActionNotSupportedException ex) 
{ 
    this.GetLogger().Error("Software-version not comaptible!", ex); 
    throw new VersionNotCompatibleException(); 
} 
catch (EndpointNotFoundException ex) 
{ 
    this.GetLogger().Error("Problem with network, connection to core is lost!", ex); 
} 
catch (CommunicationException ex) 
{ 
    this.GetLogger().Error("Not expected communication-exception was thrown:", ex); 
} 

Это делает много кода, который более или менее всегда то же самое.

Теперь я подумал о реорганизации всех блоков catch в метод и просто позвонил ему. Как

try 
{ 
    return GetLogFiles(date); 
} 
catch(Exception ex) 
{ 
    ExceptionHandling(string operation, Exception ex) 
} 


private void ExceptionHandling(string operation, Exception ex) 
{ 
    if (ex is TimeoutException) 
    { 
     this.GetLogger(operation).Error("C is not answering!", ex); 
    } 
    else if (ex is ConnectionInterruptedException) 
    { 
     this.GetLogger(operation).Error("Connection interrupted", ex); 
    } 
    else if (ex is CommunicationObjectFaultedException) 
    { 
     this.GetLogger(operation).Error("Core is not answering!", ex); 
    } 
    else if (ex is FaultException) 
    { 
     this.GetLogger(operation).Error("C is not answering!", ex); 
    } 
    else if (ex is ActionNotSupportedException) 
    { 
     this.GetLogger().Error("Software-version not comaptible!", ex); 
     throw new VersionNotCompatibleException(); 
    } 
    else if (ex is EndpointNotFoundException) 
    { 
     this.GetLogger().Error("Problem with network, connection is lost!", ex); 
    } 
    else if (ex is CommunicationException) 
    { 
     this.GetLogger().Error("Not expected communication-exception was thrown:", ex); 
    } 
    else 
    { 
     this.GetLogger().Error("Unknown exception was thrown:", ex); 
     throw new Exception("Unknown exception occured during request handling", ex); 
    } 
} 

Ни один из codeparts не делают любое обычное обращение в случае исключения, то есть они получают вход и это все.

Какие проблемы вы видите при извлечении части исключения в свой собственный метод?

+0

Единственная проблема, которую я вижу, это почему бы не использовать третью партию ошибки регистратора – Alex

+0

@Alex Мы далеко от видеть это как проблема на данный момент - по крайней мере, я есть) –

+0

Вы ничего не получаете от разделения обработки ошибок, как вы это делаете. На самом деле, ваш код еще длиннее ... –

ответ

0

Основная проблема, которую я вижу, заключается в том, что вы перерабатываете исключение, если оно не вы ожидаете, заставляя вас потерять реальную трассировку стека, плюс использование Exception в вашем улове - это очень широкая вещь.

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

+0

Должно ли передаваться 'ex' при повторном роспуске, не сохраняя трассировку стека? Кроме того, когда текущий try catch не обрабатывает неизвестное исключение, он также будет передавать его вверх. –

+0

@MarkusDeibel - Вы получаете * стек * трассировку стека, но не тот, который вызвал ошибку. – Sayse

+0

Но не второй параметр 'throw new Exception (" String ", ex)' просто означает исключение _inner_? По моему пониманию, innerException является неизменной копией исходного, который я перехожу в метод ExceptionHandling. Это также моя интерпретация этого ответа http://stackoverflow.com/a/23923541/2137237 (и комментарии). Таким образом, трассировка стека там должна быть неизменной. –

0

это лучше сделать это так:

public class MyException : Exception 
{ 
    public MyException(Exception ex) 
    { 
     // handle exception 
    } 
} 

и

try 
{ 
} 
catch(Exception ex) 
{ 
    throw new MyException(ex) 
} 
+1

Как ввести пользователя Исключение улучшит ситуацию? Что из моего примера вы бы заменили? –

+0

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

+0

Правильно ли я прав? У вас будет 'GetLogFiles' throw' MyException' и объект MyException содержит исходное исключение как innerException? Но это будет означать необходимость рефакторирования GetLogFiles (и всех его братьев и сестер) и уже улавливать все фактические исключения там - снова дублируя код обработки. –

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