2014-11-12 3 views
2

В следующем коде NDepend сообщает о нарушении из-за глубины вложенности 6 (по 1 для каждого улова), а предел равен 5. в this rule:Как рефакторинг для уменьшения глубины вложенности с помощью try/multiple catch (NDepend)

Краткое изложение методов рефакторинга

Является ли наличие только один улов для более общего IOException и имеющий код в этом улове различать DirectoryNotFound, PathTooLong и другие IOException лучший путь? Я не хочу увеличивать ограничение глубины вложенности, поскольку в большинстве случаев это допустимый предел. Что относительно случая, когда ни одно из исключений в одной иерархии и объединение не является вариантом? Создает ли атрибут и изменяет правило, чтобы отключить нарушение только для этого метода, единственный способ пойти?

private static void _TryDeleteFile(string filename) 
{ 
    try 
    { 
     File.Delete(filename); 
    } 
    catch (ArgumentException innerEx) 
    { 
     // do something 
    } 
    catch (DirectoryNotFoundException innerEx) 
    { 
     // do something 
    } 
    catch (PathTooLongException innerEx) 
    { 
     // do something 
    } 
    catch (IOException innerEx) 
    { 
     // do something 
    } 
    catch (NotSupportedException innerEx) 
    { 
     // do something 
    } 
    catch (UnauthorizedAccessException innerEx) 
    { 
     // do something 
    } 
} 
+1

Я бросаю вам повторное голосование, потому что похоже, что вы прилагаете усилия для улучшения своего вопроса, в любое время, когда вы упоминаете какую-либо ошибку или исключение, включайте полный текст сообщения, дословно (используйте '' 'at начало цитаты). Кроме того, всегда включайте тег для языка программирования или сообщение не будет видно большинству экспертов по теме. –

+0

Спасибо, теперь предложение интегрировано. –

+0

Теперь у вас есть 4 повторного открытия голосов, еще один необходимый. –

ответ

2

Во-первых, попытаться/поймать блоки не так элегантно, чтобы работать в C#, как они могли бы быть, и это как раз то, что мы должны жить с сейчас.

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

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

Рефакторинг может состоять в том, чтобы сохранить сборник «обработчиков исключений» (классов или действий) в словаре, фабричном классе или ядре IOC. Затем вы можете передать обработчик исключений в одну строку кода. Это уменьшит вложенность, но представит свою собственную сложность. Что-то вроде этого:

try 
{ 
    /* Your code */ 
} 
catch(Exception ex) 
{ 
    var exceptionHandler = _exceptionHandlers[ex.GetType()]; 
    exceptionHandler.Execute(ex); 
} 

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

+1

или, возможно: if (! _exceptionHandlers.TryGetValue (ex.GetType, out exceptionHandler)) throw ex; exceptionHandler.Execute (ex) –

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

  • Нет связанных вопросов^_^