Использование catch без аргументов - PullRequest
50 голосов
/ 04 ноября 2011

В чем разница между:

catch
{
    MessageBox.Show("Error.");
}

и

catch (Exception ex)
{
    MessageBox.Show("Error.");
    //we never use ex, so is it better to use catch without arguments?
}

Ответы [ 5 ]

64 голосов
/ 04 ноября 2011

Начиная с .NET 2, если вы не настраиваете конфигурацию? Ничего.

До этого, или с некоторыми изменениями конфигурации, которые я точно не помню, существовала возможность исключения из неуправляемого кода, который не был преобразован в Exception -совместимый объект .

Обратите внимание, что между ними есть другая опция, где вы указываете тип, но не переменную:

catch (Exception)
{
   ...
}

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

7 голосов
/ 04 ноября 2011

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

catch (Exception)
{
    //do something
}

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

6 голосов
/ 04 ноября 2011

Как правило, вы должны сначала поймать конкретные ошибки.

Но если вы поймаете генерала Exception, как вы, я бы сказал, используйте второй случай:

catch (Exception ex)
{
     MessageBox.Show("Error.");
     //we never use ex, so is it better to use catch without arguments?
}

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

Будьте очень осторожны, используя этот подход:

MessageBox.Show("Error.");

Не отслеживание ваших ошибок где-либо (например, файла журнала) может привести к очень большой неразберихе.

3 голосов
/ 04 ноября 2011

Во втором примере вы можете ссылаться на данные исключений, такие как трассировка стека, источник и т. Д. Он также дает общее сообщение, которое иногда полезно.Он сообщает вам, ПОЧЕМУ вы перенесли исключение, которое важно при отладке.

0 голосов
/ 13 июня 2017

Некоторое исключение не может быть catch(Exception) перехвачено.

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

В противном случае среда выполнения игнорирует catch(Exception) оценку.

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

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

P.S. Я не знаю, как на Windows, программа запускается в Windows нормально.

...