Поймать большинство производных исключений? - PullRequest
6 голосов
/ 21 июня 2010

В .NET при перехвате исключений я должен всегда перехватывать производные исключения (не ArgumentException, а производные типы)?

Также:

Если меня попросят использовать коды ошибок, будет ли это в конструкторе примерно так:

бросить новое исключение ("4000", ex);

Или пользовательский тип исключения со свойством errorcode? (Это может привести к путанице с типами исключений, такими как SqlException, которые имеют коды ошибок, сопоставляемые с ошибками SQL Server).

Спасибо

Ответы [ 2 ]

6 голосов
/ 21 июня 2010
  1. Поймайте самое широкое исключение, которое вы знаете, как обрабатывать.

    В общем, это означает, что вы будете ловить довольно специфическое исключение. И некоторые исключения, такие как ArgumentException s, вообще не должны быть перехвачены, поскольку они указывают на логическую ошибку, а не на ошибку времени выполнения. Одним из мест, где я нашел отлов более широкого исключения, является случай ввода-вывода файлов. IOException может быть практическим исключением более высокого уровня для ловли.

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

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

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

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

2 голосов
/ 21 июня 2010

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

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

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

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