Зачем создавать пользовательские исключения?

Почему нам нужно создавать пользовательские исключения в .NET?

Ответ 1

Специфические таможенные исключения позволяют отделять разные типы ошибок для ваших выписок. Общей конструкцией для обработки исключений является следующее:

try
{}
catch (Exception ex)
{}

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

try
{}
catch (CustomException1 ex1)
{
    //handle CustomException1 type errors here
}
catch (CustomException2 ex2)
{
    //handle CustomException2 type errors here
}
catch (Exception ex)
{
    //handle all other types of exceptions here
}

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

Ответ 2

В последнее время я сделал длинный блог на эту тему:

http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx

Суть его сводится к следующему: создать собственное исключение, если одно из следующих значений:

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

Ответ 3

Итак, вы также можете бросить их сами, а затем поймать их и точно знать, что они означают.

Также: если вы создаете библиотеку классов /framework/api, часто бывает полезно создать BaseException, из-за чего наследуются другие исключения в вашем коде. Затем, когда ваш код вызывает исключения, программисты, которые его используют, могут быстро узнать источник исключения.

Ответ 4

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

Ответ 5

Я не уверен, почему "технически", но позволяет сказать, что у меня есть приложение/веб-сайт, который использует разрешения. Если кто-то не имеет правильного разрешения, его глупость бросить исключение DivideByZero или исключение IOException. Вместо этого я могу создать мое AccessDeniedException, которое поможет мне позже отлаживать.

Ответ 6

По той же причине вы бы создали разные коды выхода для приложения не .NET: чтобы указать разные ошибки, зависящие от конкретной программы. Как... ConnectionBrokenException или um... UserSmellsBadException... или что-то.

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

Ответ 7

Как писал Джоэл: "Вы также можете бросить их сами, а затем поймать их и точно знать, что они означают.

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

Ответ 8

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

Я написал об этом частном случае:

http://blog.mikecouturier.com/2010/01/creating-custom-exceptions-in-net-right.html

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

Вы не должны, если встроенные исключения правильно описывают проблему/исключение. Я бы не стал создавать собственные базовые классы для создания пользовательских ArgumentException, ArgumentNullException или InvalidOperationException.

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

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