C #: Статья о броске надлежащего типа исключения

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

  •  27-09-2019
  •  | 
  •  

Вопрос

Иногда я не знаю, что тип исключения ведьмы я должен бросить. Так что я обычно бросаю исключение (). Есть ли какая-то хорошая статья об этом?

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

Решение

Если вы не предпринимаете никакой попытки оправиться от ошибки, вы можете просто выбрасывать Exception со строкой, чтобы сказать вам, что пошло не так. (Или если вы будете выполнять то же действие независимо от того, какая произошла ошибка).

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

Например, ArgumentNullException имеет свойство ParamName, который вы должны установить, когда вы бросаете исключение. Когда вызывающий абонент его ловит его, он может посмотреть на это свойство и решите передать новое значение для аргумента, который вызвал ошибку или может распечатать соответствующую ошибку для информирования программиста, что пошло не так.

К сожалению, что исключения редко используются для их полного потенциала (во многих открытых источниках API и такими), и часто просто вставляются для информирования программиста, что пошло не так. Там не так много раз разницы между этими 2, если вы не планируете прочитать ParamName Собственность, когда вы его поймаете. (Многие люди не будут беспокоить, и только поймать Exception в любом случае).

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

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

На данный момент я бы просто положил Exception в браузер объекта поиск в против, и посмотреть, что уже есть. Их имена довольно самочувствие, поэтому вы сможете выбрать что-то подходящее.

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

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

Jeffrey Richter имеет отличный раздел об обработке исключений (включая информацию о пространстве имен System.Exception) в CLR через C #

«Рекомендации Framework Design» Cwalina и Abramms охватывают эту тему действительно хорошо (ИМХО).

Это доступно бесплатно онлайн здесь, или книга (не бесплатно) здесь (Великобритания) или здесь (нас). Отказ Смотреть в раздел под названием Руководство по проектированию для исключения.

Ну, единственная вещь, которую вы не должны делать, это бросить Exception сам.
Всегда ищите соответствующий подкласс.

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

Задайте отдельных вопросов о отдельных случаях, если они придумывают.

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

  1. Метод не удался таким образом, что это ничего не сделало; Состояние любых базовых данных не было нарушено и, вероятно, является действительным. Типичные сценарии: пытаясь получить из коллекции объект, который не там, или добавьте один, который уже есть. Другим возможным сценарием: время ожидания связи в случаях, когда он не должен вызвать какие-либо данные потери (и были повторно, операция может быть успешной, если проблема была просто то, что другой конец был просто слишком медленным).
  2. Метод не удался в моде, который, возможно, нарушил базовую структуру данных, или основная структура данных, возможно, была повреждена ранее. Дальнейшие операции не должны быть предприняты попытки этой структуры данных, если шаги не будут предприняты для его подтверждения. Другим возможным сценарием: время ожидания связи происходит, когда запись была частично извлечена, а частично полученные данные теперь теряются. В зависимости от протокола, может потребоваться выполнить некоторые возмещенные действия на соединении или закрыть его и инициировать новую.
  3. Что-то серьезно не так с состоянием системы, и выздоровление, вероятно, невозможно.

К сожалению, существующие исключения .NET не соответствуют ничего подобным образом; Было бы неплохо, если бы произошло тип исключения, из которых были получены вещи, такие как ThreadabortException, CpuhascavyFireexception, и «нормальное» исключение, и все «нормальные» исключения были получены от исключения. Я понимаю, что .NET 4.0 несколько Kludges в таком дизайне, но я не знаю точную механику. В любом случае, я бы предположил, что любые пользовательские исключения должны быть разделены на группы, как указано выше, со всеми исключениями в каждой группе разделяют общего предка, отличного от других групп.

Существует статья Crzysztof Cwalina («главный архитектор на .NET Framework Team в Microsoft») Выбирая правильный тип исключения, чтобы бросить Это проливает свет на это. Он занимается выбором правильного исключения, чтобы бросить и руководство по созданию пользовательских исключений.

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