Невозможно объявить неиспользуемую переменную исключения при использовании универсального шаблона - PullRequest
2 голосов
/ 30 мая 2010

Что является наилучшей практикой в ​​таких случаях, как этот:

try
{
   // do something
}
catch (SpecificException ex)
{
    Response.Redirect("~/InformUserAboutAn/InternalException/");
}

предупреждение я получаю, что ex никогда не используется .

однако все, что мне нужно здесь, это информировать пользователя, поэтому мне это не нужно.

Должен ли я просто сделать:

try
{
   // do something
}
catch
{
    Response.Redirect("~/InformUserAboutAn/InternalException/");
}

как-то мне это не нравится, кажется странным !! какие-нибудь советы? лучшие практики?

Какой бы способ справиться с этим.

Thnx

Ответы [ 6 ]

8 голосов
/ 30 мая 2010

Вы просто не объявляете переменную:

try
{
   // do something
}
catch (SpecificException)
{
    Response.Redirect("~/InformUserAboutAn/InternalException/");
}

Это спорный вопрос при перехвате System.Exception (в исходном примере, который не совсем совпадает с пустым catch - , пустой catch также будет перехватывать исключения COM * , например), но это правильная конструкция для использования.

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

Это не значит, что вы никогда не должны поймать Exception; просто редко.

3 голосов
/ 30 мая 2010

Если вам не нужна переменная Exception для получения некоторой информации, не объявляйте ее

try { }
catch ( ) 

равно

try { }
catch (Exception) { }

Используйте это

try { }
catch (Exception ex) { var m = ex.Message; }

если вам нужна информация для сбора.

Используйте это

try { }
catch (FooException) { }
catch (BarException) { }

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

2 голосов
/ 30 мая 2010

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

1 голос
/ 30 мая 2010

Есть ли причина, по которой вы не позволили бы необработанным исключениям просто выбросить и использовать встроенную в ASP.NET обработку ошибок уровня приложения? См. Как обрабатывать ошибки уровня приложения для получения более подробной информации.

0 голосов
/ 30 мая 2010

Есть две причины объявить переменную исключения в блоке catch. Чтобы поймать только определенные типы исключений или сделать что-то с информацией об исключении. В вашем случае вы не делаете ни того, ни другого, это не имеет смысла.

0 голосов
/ 30 мая 2010

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

...