Различные способы попробовать поймать в C # - PullRequest
2 голосов
/ 07 апреля 2011

У меня был этот блок кода:

try
 {
// DO SOMETHING
 }
catch (Exception e)
 {  
    throw new WebPartPageUserException("YEAH MESSAGE");
}

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

Затем я изменяю на

try
{
 // DO SOMETHING
}
catch (Exception)
{  
     throw new WebPartPageUserException("YEAH MESSAGE");
}

И это было нормально, но в конце концов я узнал, что

try
{
    // DO SOMETHING
}
   catch 
{  
   throw new WebPartPageUserException("YEAH MESSAGE");
}

тоже работает.

Эти 3 блока делают то же самое?В таком случае, что является лучшей практикой?

Ответы [ 6 ]

10 голосов
/ 07 апреля 2011

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

2 голосов
/ 07 апреля 2011

Вы должны сделать это:

try
{
    // DO SOMETHING
}
catch (Exception ex)
{  
    throw new WebPartPageUserException("YEAH MESSAGE", ex);
}

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

2 голосов
/ 07 апреля 2011

Это зависит от того, что вы хотите.catch один поймает любое исключение.Так что да, это то же самое, что и catch (Exception).Иногда вы хотите поймать специальные исключения другим способом.Как NullReferenceException, так что вы должны указать это.Если вы хотите исключение в качестве переменной, вы можете сказать catch (NullReferenceException e), а затем сказать: e.StackTrace() или что-то подобное.

Итак, в этом случае, то же самое, но есть способы, которые победили 'это не то же самое.

Я согласен с плохой практикой @Daniel, но иногда она нужна.

Обновление
Если вы поймали исключение и бросилиновый, вы можете установить перехваченное исключение как innerException вашего нового

1 голос
/ 07 апреля 2011

Если вы вообще не собираетесь использовать ссылку на исключение, используйте последний вариант.Второй вариант, как написано, ловит только исключения, полученные из «Исключения» или подклассов.Использование этого стиля обработки исключений полезно, если вы хотите различать различные виды исключений, но не собираетесь использовать ссылку на исключение.Пример:

try
{
     DoSomething();
}
catch (NotSupportedException)
{
     Console.Error.WriteLine("The software won't do what you wanted it to");
}
catch (InvalidOperationException)
{
     Console.Error.WriteLine("A possible programming error in the software?");
}

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

1 голос
/ 07 апреля 2011

catch (Exception) только перехватывает исключения типа Exception или унаследованные от этого. catch ловит все исключения.

Поскольку большинство (все?) Исключений наследуются от Exception, # 2 и # 3 будут делать то же самое. Для лучшей практики, ловите только те исключения, которые вы можете обработать изящно. (Вы должны учитывать все исключения, которые может генерировать ваш блок try, или, по крайней мере, попытаться выполнить ^^)

1 голос
/ 07 апреля 2011

Не знаю о наилучшей практике, но лично я держусь подальше от универсального "catch all" try catch блока ... Попробуйте код, чтобы вы тестировали сценарий, который вызвал бы исключение, и делали поток кода соответствующим образом, чтобы иметь дело сошибка.

...