Плохо ли использовать свойство сообщения об исключении для проверки конкретной ошибки? - PullRequest
8 голосов
/ 21 февраля 2011

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

В моих текущих обстоятельствах я получаю сообщение CommunicationException, которое выдает сообщение об ошибке:

Превышена квота максимального размера сообщения для входящих сообщений (65536)

Поскольку с помощью CommunicationException может выдаваться несколько разных ошибок, не рекомендуется ли использовать свойство сообщения для определения причины, например:

catch (CommunicationException ex)
{
    if (Regex.IsMatch(ex.Message, "The maximum message size quota for incoming messages .* has been exceeded"))
    {
        // handle thrown exception
    }
    throw;
}

Будут ли эти сообщения постоянными и надежными во всех системах?Есть ли другие соображения, такие как локализация?

Вывод:

Мой сценарий с «CommunicationException» был плохим примером, так как позже я понял, что былQuotaExceededException в свойстве InnerException.Благодаря ответам я знал, что нужно искать любые данные, которые существовали в исключении, чтобы указать точную причину.В данном случае это было свойство InnerException.

Что касается вопроса о том, следует ли использовать свойство сообщения для определения причины, то, по-видимому, существует общее мнение, что его следует избегать, если нетнет альтернативы.Значение свойства сообщения может не оставаться постоянным в разных системах из-за локализации.

Ответы [ 5 ]

6 голосов
/ 21 февраля 2011

ИМХО магические струнные решения всегда должны быть последним средством.

Вы уверены, что не можете разрешить тип ошибки из дополнительных свойств объекта CommunicationException:

http://msdn.microsoft.com/en-us/library/system.servicemodel.communicationexception.aspx

.. или вы получаете InnerException, который более полезен?

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

Сообщения об исключениях на английском языке?

4 голосов
/ 21 февраля 2011

Да.

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

Если вы имеете дело с какой-то платформой или чем-то, что написано плохо, и у вас нет другого пути наверняка (ничего в свойстве Data или InnerException или чем-то еще), тогда это плохо, но вы должны.

1 голос
/ 21 февраля 2011

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

0 голосов
/ 21 февраля 2011

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

0 голосов
/ 21 февраля 2011

"Неправильно ли использовать свойство сообщения для определения причины"

Да

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