A partir da versão 6.0 a linguagem C inclui suporte a filtros de exceção que permite capturar um tipo específico de exceção se uma expressão associada for verdadeira. Você pode filtrar exceções, incluindo uma instrução when após a expressão catch.
A palavra-chave when funciona como um if. Uma condição when é uma expressão de predicado, que pode ser anexada a um bloco catch. Se a expressão do predicado for avaliada como verdadeira, o bloco de captura associado é executado; Caso contrário, o bloco catch é ignorado.
No exemplo abaixo, definimos um filtro que não captura a exceção da divisão por zero aos domingos:
DateTime dia = DateTime.Now; CultureInfo idioma = new CultureInfo("pt-BR"); int denominador; try { denominador = 0; int x = 5 / denominador; } // Captura a exceção todos os dias exceto no domingo catch (DivideByZeroException ex) when (dia.DayOfWeek != DayOfWeek.Sunday) { //exibe a data em português Console.WriteLine("Hoje é " + dia.ToString("D", idioma)); Console.WriteLine(ex.Message); } Console.ReadKey();
Um caso de uso comum são tipos de exceção que são realmente um invólucro para vários tipos de erros diferentes.
try { DatabaseUpdate() } catch (SQLException e) when (driver == "MySQL") { //MySQL - tratamento de erros específicos e encerramento da exceção } catch (SQLException e) when (driver == "Oracle") { //Oracle - tratamento de erros específicos e encerramento da exceção } catch (SQLException e) when (driver == "SqlServer") { //Sql Server - tratamento de erros específicos e encerramento da exceção }
Assim, você usa a cláusula when para casos em que o tipo da exceção não é suficientemente distinto para determinar se a exceção deve ser tratada aqui ou não.