Neste artigo vou apresentar as Exceptions Filters, ou filtros em exceções, o novo recurso da versão 6.0 da linguagem C#. |
Nota: Esse recurso já existia no VB .NET.
Isso
significa que em um bloco try/cacth, com vários blocos catch,
podemos decidir qual bloco catch deverá ser executado segundo um
critério pré-definido, especificando uma condição no block catch.
Isso pode ser implementado facilmente adicionando a condição when
junto com os blocos catch.
try
{
// código passível de erro
}
catch (Exception e) when (Filtro(e))
{
// acão
}
|
Por exemplo, no código a seguir, estamos forçando uma exceção fazendo uma divisão por zero, e, definindo duas condições em cada bloco catch.
static void Main(string[] args) { Console.WriteLine("Forçando uma exceção na divisão por zero");
int i = 5; |
|
No primeiro bloco catch definimos que quando ocorrer a exceção ele será executado se o valor de i for maior que 5.
No segundo bloco catch definimos que ao ocorrer a exceção ele será executado se o valor de i for menor ou igual a 5.
Como o valor de i é igual a 5, temos que o segundo bloco catch será executado. Conforme mostra a figura a lado do código.
Mas não conseguiríamos o mesmo resultado definindo o código para as condições dentro do bloco de captura ?
É
lógico que sim, mas existe uma diferença fundamental.
Se sua condição esta no bloco catch, você esta capturando a exceção e
então verificando a condição, enquanto que usando Exception Filters
você esta verificando a condição antes de capturar a exceção.
Se a condição não for satisfeita, o bloco catch será ignorado e o código se move para verificar se existem outros blocos catch que correspondem à exceção. Certo !!!!
Podemos usar esse recurso de diversas formas, como no exemplo a seguir, onde estamos redirecionando para uma página em uma aplicação web.
protected void Page_Load(object sender, EventArgs e)
{
try
{
//Chamando uma página que pode não existir
Response.Redirect("~/Admin/Login.aspx");
}
catch (HttpException hex) if(hex.GetHashCode==400)
{
lblMessage.Text="Este página não foi encontrada !";
}
catch (HttpException hex) if(hex.GetHashCode==500)
{
lblMessage.Text="Erro interno do servidor !";
}
}
|
Fazendo o tratamento de exeção e usando o Exeption Filters podemos definir o bloco a ser executado com base no código do erro que gerou a exceção.
Ao usar este recurso prefira capturar e relançar a exceção pois dessa forma você mantém a pilha intacta. Se posteriormente uma exceção fizer com que a pilha seja despejada, você poderá ver a fonte original dela, em vez de apenas o último local onde o erro ocorreu.
Todas as coisas são puras para os
puros, mas nada é puro para os contaminados e infiéis; antes o seu
entendimento e consciência estão contaminados.
Confessam que conhecem a Deus, mas negam-no com as obras, sendo abomináveis,
e desobedientes, e reprovados para toda a boa obra.
Tito 1:15,16
Referências: