Когда использовать пользовательское исключение и несколько хороших примеров / лучших практик? - PullRequest
1 голос
/ 08 апреля 2010

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

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

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

В конце концов, вы не можете просто сделать это: throw new Exception("Some Error Message");

Ответы [ 6 ]

3 голосов
/ 08 апреля 2010

Наличие пользовательских исключений полезно, потому что оно позволяет вам обрабатывать различные виды ошибок определенным образом. Почему .NET определяет так много разных типов исключений, если они могут просто генерировать все исключения как System.Exception с другим текстовым сообщением? Причина того, что в .NET существуют различные типы исключений, заключается в том, что вы можете отлавливать отдельные типы ошибок и обрабатывать их по-разному. По этой же причине вы определяете свои собственные пользовательские исключения - чтобы вы могли предоставить другой ответ в зависимости от типа возникшего исключения.

Вы также можете создавать определяемые пользователем исключения, которые включают дополнительные данные. Например, вы можете определить уровень серьезности на основе перечисления, целочисленного кода ошибки или чего-либо еще, что может быть полезно для вызывающей программы, чтобы определить, что пошло не так. Что касается логики для включения в исключения, я обычно просто пытаюсь сообщить, что пошло не так и оставить логику (что делать с ошибкой) вызывающей программе. В некоторых случаях у меня есть код исключения, который автоматически записывает ошибку в файл журнала, если она превысила определенный уровень серьезности (например, выдаются предупреждения, но в файл журнала записываются только критические ошибки).

2 голосов
/ 08 апреля 2010

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

Например, в моих классах конфигурации (которые обычно являются обертками вокруг ConfigurationManager), я выкидываю ConfigurationErrorsException, когда значение не может быть проанализировано правильно.

При синтаксическом анализе пользовательских значений из текста или чего-то другого, требующего специального формата, и при синтаксическом анализе происходит сбой FormatException

Однако, если у моего BankAccount объекта недостаточно денег, чтобы я мог снять £ 10, тогда я напишу и скину InsufficentFundsException, потому что тогда я смогу справиться с этим конкретным случаем ошибки, если он когда-либо произойдет .

Надеюсь, это (несколько) поможет.

2 голосов
/ 08 апреля 2010

Вы должны создать очень мало определенных пользователем исключений. Их следует использовать, только если кто-то собирается поймать исключение и сделать с ним что-то конкретное Если выбрасывание исключения вместо InvalidOperationException не приведет к тому, что код будет вести себя иначе, то throw

1 голос
/ 08 апреля 2010

Вы также можете добавить свойства для хранения дополнительных метаданных с определенным пользователем исключением, таким как код ошибки (например, при вызове неуправляемого API). Это удобнее для пользователя, чем просто помещать материал в свойство Data объекта Exception.

1 голос
/ 08 апреля 2010

Определенные пользователем исключения могут использоваться в компоненте, чтобы предоставить потребителям компонента возможность ловить их с большей степенью детализации, чем в блоке catch (Exception).Это даст потребителю компонента возможность выполнять различные задачи, в зависимости от которых было сгенерировано исключение.Определенные пользователем исключения должны создаваться только тогда, когда существует реальное ожидание того, что потребители будут использовать их для дифференциации таким образом.

1 голос
/ 08 апреля 2010

Нет, они не только для сообщений. Вы можете найти определенные пользователем в списке исключений блока catch.

catch(UserDefinedException){}
catch(Exception){}

Вы можете использовать определяемые пользователем исключения в любое время, когда хотите найти что-то конкретное, что происходит. Возможно, идентификатор клиента выходит за пределы указанного диапазона, и вы хотите найти это специально. Вместо того, чтобы анализировать сообщение об ошибке (которое может быть болезненным и подвержено ошибкам, например, если сообщение меняется позже), у вас есть исключение, которое вы используете, и вы знаете, что где-то еще в коде специально сказано you "Эй, это случилось. Ты должен знать об этом."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...