Можем ли мы использовать несколько блоков catch в C#?
Можно ли использовать несколько блоков catch?
Что я уже пробовал:
ученик класса
{
пробовать{
...
}
поймать (исключение бывший)
{
}
поймать (исключение с)
{
}
наконец()
{
}
}
Да, конечно, вы можете иметь несколько блоков catch в C#. Начиная с C#6, теперь у вас есть фильтры исключений (VB.NET у него это было уже давно). Смотрите раздел "функции уровня оператора" здесь: [^].
Я настоятельно рекомендую вам изучить эти рекомендации по обработке исключений от MS: [^].
F-ES Sitecore показал вам хороший пример здесь, но есть одна "особенность" этого примера, которую я думаю, что это не очень хорошая практика: наличие "общего улова", который будет "глотать" любой тип исключения, который вы не поймали.
имхо, хорошая практика требует, чтобы вы по крайней мере лог ошибка, которую вы "проглатываете"." И, ИМХО, лучшая практика-это "никогда не глотать", но повторно бросать, если вы должны использовать "все уловки"."
Если вы хотите использовать несколько блоков catch тип исключения должен быть другим
catch (ExceptionType1 a) { } catch (ExceptionType2 b) { } catch (ApplicationException c) { } catch (Exception d) { }
Как я могу определить и добавить свои собственные исключения?
Вы забыли упомянуть, что порядок улова имеет значение. Из документации:
порядок предложений catch, поскольку предложения catch проверяются в порядке. Ловите более конкретные исключения раньше, чем менее конкретные. Компилятор выдает ошибку, если вы заказываете блоки catch таким образом, чтобы более поздний блок никогда не был достигнут.
- вы забыли упомянуть, что порядок улова имеет значение.
Вы забыли прочитать мой ответ, прежде чем комментировать :)
+4 Хороший ответ; я высказал свою единственную оговорку о коде в своем посте.
к вашему сведению: re ApplicationExceptionre
Джеффри Рихтер в руководстве по разработке фреймворков:
"System.ApplicationException is a class that should not be part of the .NET Framework. The original idea was that classes derived from SystemException would indicate exceptions thrown from the CLR (or system) itself, whereas non-CLR exceptions would be derived from ApplicationException. However, a lot of exception classes didn't follow this pattern. For example, TargetInvocationException (which is thrown by the CLR) is derived from ApplicationException. So, the ApplicationException class lost all meaning. The reason to derive from this base class is to allow some code higher up the call stack to catch the base class. It was no longer possible to catch all application exceptions."