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

StackOverflow https://stackoverflow.com/questions/2600607

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top