2015-10-02 2 views
2

Теперь я пишу код C# после PHP.Хорошая практика иерархии исключений в C#

В PHP Я создаю иерархию исключений, руководствуясь рекомендациями Zend Framework (Symfony теперь использует нечто подобное).

В упаковке (например, приказ) создать папку исключений, в этой папке (перевод с PHP на C#):

namespace Order.Exception 
{ 
    interface ExceptionInterface{} 
    class ApplicationException : System.ApplicationException, ExceptionInterface{} 
    class OrderNotFoundException : ApplicationException {} 
    class SomethingHappensException : ApplicationException{} 
} 

мне нужно много исключений (относительно) удобно выразить вещи из области ,

Есть ли какие-либо рекомендации по созданию иерархии исключений?

Технические детали создания Я полностью понимаю. Вопрос о хорошей практике.

+0

Использование встроенных или создание пользовательских. Обрабатывайте их по специфичности - наиболее конкретным, по крайней мере, последним. Не становитесь сумасшедшими с наследованием или интерфейсами, это просто сделает его более сложным, чем это должно быть. –

ответ

5

Две цитаты из CLR через C#, 4-е издание:

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

(...)

Есть управления версиями последствия здесь. Если вы определяете новый тип исключения , полученный из существующего типа исключения, тогда весь код , который поймает существующий базовый тип, теперь поймает ваш новый тип как нуль . В некоторых сценариях это может быть желательным, и в некоторых сценариях может оказаться нежелательным. Проблема в том, что это действительно зависит от того, как код , который ловит базовый класс, отвечает на тип исключения и производные от него . Код, который никогда не ожидал нового исключения , теперь может вести себя непредсказуемо и открывать дыры в безопасности. Лицо , определяющее новый тип исключения, не может знать обо всех местах, где исключено базовое исключение и как оно обрабатывается. Итак, в практике здесь невозможно сделать хорошее интеллектуальное решение.

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