Почему catch(Exception)
почти всегда плохая Идея?
Потому что, когда вы перехватываете исключение , вы должны обрабатывать его правильно . И вы не можете ожидать обработки всех видов исключений в своем коде. Кроме того, когда вы перехватываете все исключения, вы можете получить исключение, которое не может обработать и предотвратить код, который находится выше в стеке, для его правильной обработки.
Общий принцип - поймать наиболее конкретный тип, который вы можете.
Вы должны перехватывать исключения, только если вы умеете их правильно обрабатывать. Поскольку вы не можете должным образом обработать все возможные исключения, вы не должны их перехватывать: -)
Потому что вы действительно не знаете, почему произошло исключение, а для некоторых исключений требуется особая машина для правильной обработки (если это вообще возможно), например OutOfMemoryException и аналогичные низкоуровневые системные исключения.
Таким образом, вы должны перехватывать только исключения:
Это зависит от того, что вам нужно. Если вам нужно обрабатывать разные типы исключений по-разному, вам следует использовать несколько блоков catch и перехватывать как можно больше конкретных исключений.
Но иногда может потребоваться одинаковая обработка всех исключений. В таких случаях улов (исключение) может быть приемлемым. Например:
try
{
DoSomething();
}
catch (Exception e)
{
LogError(e);
ShowErrorMessage(e); // Show "unexpected error ocurred" error message for user.
}
Краткая история: это называется маскировкой ошибок. Если у вас есть фрагмент кода, который не работает должным образом и генерирует исключения (или вы передаете неверный ввод в этот фрагмент кода), и вы просто ослепляете глаза, перехватывая все возможные исключения, вы фактически никогда не обнаружите ошибку и не исправите ее.