Поделиться через


Использование обработчиков исключений с пользовательской фильтрацией

Обработчики исключений с пользовательской фильтрацией перехватывают и обрабатывают исключения с учетом определенных для исключения требований. Эти обработчики используют инструкцию catch с when ключевое слово (Catchи When в Visual Basic).

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

В следующем примере показана catch/when инструкция.

try
{
    //Try statements.  
}
catch (Exception ex) when (ex.Message.Contains("404"))
{
    //Catch statements.
}
Try  
    'Try statements.  
    Catch When Err = VBErr_ClassLoadException
    'Catch statements.
End Try  

Выражение для предложения пользовательской фильтрации не ограничено. При возникновении исключения в выражении с пользовательской фильтрацией это исключение отбрасывается, а выражение фильтрации считается равным false. В этом случае среда CLR продолжает поиск обработчика для текущего исключения.

Объединение конкретных исключений и предложений, отфильтрованные пользователем

Инструкция catch может содержать как конкретное исключение, так и предложения, отфильтрованные пользователем. Сначала среда выполнения проверяет конкретное исключение. Если проверка пройдена, среда выполнения выполняет фильтр пользователя. Общий фильтр может содержать ссылку на переменную, объявленную в классе фильтра. Обратите внимание, что порядок двух выражений фильтра изменить нельзя.

В следующем примере показано определенное исключение в инструкции catch, а также предложение, отфильтрованное пользователем, с помощью ключевое слово.

try
{
    //Try statements.  
}
catch (System.Net.Http.HttpRequestException ex) when (ex.Message.Contains("404"))
{
    //Catch statements.
}
Try  
    'Try statements.
    Catch cle As ClassLoadException When cle.IsRecoverable()  
    'Catch statements.
End Try  

См. также