Вы ловите исключения, которые вы хотите затем отфильтровать более тщательно, чтобы затем вы могли передумать, решить не обрабатывать их и перебросить их?
Если вы хотите быть очень осторожным с этим, это не очень хорошая идея. Лучше никогда не ловить исключение в первую очередь. Причина в том, что данный обработчик try/catch
не должен принимать решение о запуске вложенных блоков finally
для исключений, которые он не ожидает увидеть. Например, если есть NullReferenceException
, вероятно, будет очень плохой идеей продолжать выполнение любого кода, поскольку это, вероятно, вызовет другое подобное исключение. И finally
блоки - это просто код, как и любой другой код. Как только исключение будет обнаружено в первый раз, будут выполнены любые блоки finally
в стеке под try/catch
, к этому времени уже слишком поздно - может быть сгенерировано другое исключение, и это означает, что исходное исключение потерял.
Это подразумевает (в C #), что вам нужно тщательно выписать отдельный обработчик catch
для всех типов исключений, которые вы хотите перехватить. Это также означает, что вы можете фильтровать только по типу исключения. Это иногда очень трудный совет для подражания.
Должна быть возможность фильтровать исключения другими способами, но в C # это не так. Однако это возможно в VB.NET, и сам BCL использует это, имея небольшой объем кода, написанного на VB.NET, поэтому он может фильтровать исключения более удобным способом.
Вот подробное объяснение с примером кода VB.NET из блога команды CLR.
А вот мои два цента.