Exception Filters - C# 6.0
O objetivo deste artigo é apresentar o recurso conhecido como Exception Filters, uma das novas funcionalidades que integram a versão 6.0 da linguagem C#.
** Este post foi elaborado com base em um material publicado através do grupo de usuários .NET Coders, uma das principais comunidades de desenvolvimento no mundo.
*
Introdução
O tratamento de um tipo específico de exceção nem sempre pode ser realizado a partir de um bloco genérico de instruções. As informações de diferentes condições de erro podem ser encapsuladas em uma mesma estrutura derivada do tipo Exception (namespace System), com dados adicionais estando associados a propriedades específicas da classe em questão. Um bom exemplo que ilustra este cenário na plataforma .NET é a classe SqlException (namespace System.Data.SqlClient), a qual conta com a propriedade Number para detalhar um variado e extenso conjunto de problemas (erros internos num servidor de banco de dados, falhas de conexão, dentre outros comportamentos anormais que possam vir a ocorrer).
Em versões anteriores da linguagem C# a implementação de diversos tratamentos a partir de um mesmo tipo de exceção implicava, basicamente, na codificação de diversos trechos condicionais dentro de um bloco “catch” (ou em um método acionado através deste último). Na próxima listagem está um exemplo que demonstra uma situação deste gênero:
- Exceções baseadas na classe TesteException estão sendo manipuladas em um único bloco “catch”, com diferentes condições sendo tratadas em blocos específicos;
- Cada bloco “if” exibirá uma diferente mensagem, considerando para isto uma faixa de valores associados à propriedade NivelSeveridade.
using System;
namespace TesteExceptionFilters
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"Testando a geração de exceções...");
try
{
throw new TesteException(
"Gerando um erro para demonstração...");
}
catch (TesteException ex)
{
if (ex.NivelSeveridade == 1)
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade baixo...");
}
else if (ex.NivelSeveridade <= 3)
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade moderado...");
}
else
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade alto...");
}
}
Console.ReadKey();
}
}
}
Já a definição do tipo TesteException pode ser observada na listagem a seguir. Para efeitos de teste a propriedade NivelSeveridade está sendo preenchida com um valor aleatório que varia de 1 a 5, fazendo uso para isto de uma instância da classe Random (namespace System).
using System;
namespace TesteExceptionFilters
{
public class TesteException : Exception
{
private int _nivelSeveridade;
public int NivelSeveridade
{
get
{
return this._nivelSeveridade;
}
}
public TesteException(string mensagem)
: base(mensagem)
{
Random r = new Random();
this._nivelSeveridade = r.Next(1, 5);
}
}
}
Exception Filters
O recurso conhecido como “Exception Filters” foi incorporado ao C# 6.0, tendo por objetivo simplificar cenários como o proposto no exemplo desta seção. A partir da inclusão de uma cláusula “when” a blocos iniciados por catch, esta construção permite a codificação de seções específicas para diferentes tratamentos englobando um mesmo tipo de exceção.
Na próxima listagem é possível observar o código inicial refatorado, com o tratamento de erros do tipo TesteException já empregando Exception Filters.
using System;
namespace TesteExceptionFilters
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"Testando a geração de exceções...");
try
{
throw new TesteException(
"Gerando um erro para demonstração...");
}
catch (TesteException ex) when (ex.NivelSeveridade == 1)
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade baixo...");
}
catch (TesteException ex) when (ex.NivelSeveridade <= 3)
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade moderado...");
}
catch (TesteException)
{
Console.WriteLine(
"Aconteceu um erro com um nível de severidade alto...");
}
Console.ReadKey();
}
}
}
O resultado da execução destas instruções pode ser visualizado na imagem a seguir:
Links
C# 6.0 - Novos Recursos (Exemplos)
https://gallery.technet.microsoft.com/C-60-Novos-Recursos-d22a7d9d
New Language Features in C# 6
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6
.NET Coders – Blog
http://netcoders.com.br/blog/
.NET Coders – Facebook
https://www.facebook.com/groups/netcoders/
.NET Coders – Meetup
http://www.meetup.com/pt/NetCoders/