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.
