Neste artigo veremos os conceitos sobre o tratamento de erros com o throw e o bloco finally em C#.
Apenas lembrando o artigo anterior: nele, usamos o bloco catch para tratarmos a exceção gerada no bloco try. O catch pega qualquer exceção gerada em tempo de execução (Exception e), o que não é uma boa prática de programação, já que não nos permite tratar de maneira específica uma determinada exceção lançada.
Saiba mais: Tratamento de erros com os blocos Try e Catch em C#
Importante relembrar também que, havendo vários blocos catch, a ordem deve ser sempre da classe mais específica para a mais genérica (sempre ficará por último o Exception e, que é a classe genérica).
throw – É fundamental, algumas vezes, que determinadas exceções que podem ser geradas em métodos ou situações especificas sejam tratadas. A palavra reservada throw dispara um erro criado pelo programa em tempo de execução. Essa instrução deve ser colocada dentro de um bloco try.
Como exemplo, podemos citar uma operação com números, supondo que qualquer número par é valido, e ímpar inválido. O exemplo a seguir dispara um erro se um número for ímpar:
try
{
int numero = Convert.ToInt32(txtValor.Text);
if ((numero % 2) > 0)
{
throw new Exception("O número ímpar é inválido!");
}
}
catch (Exception ex)
{
lblMensagem.Text = ex.Message;
}
finally – No C#, contamos com um recurso muito útil, que é um bloco que nos permite liberar recursos que foram alocados na execução do programa e que, após a execução do try, não precisam mais ser utilizados. Trata-se do bloco finally: quando usado em conjunto com o bloco try, os comandos que estiverem entre o bloco definido por finally{} sempre serão executados, independentemente se foram geradas exceções ou não no bloco try. Legal né?!
No bloco try, pode existir uma instrução de retorno. Neste caso, após essa instrução, o bloco finally também é executado. Quando não houver exceções no bloco try, após este ser finalizado, o bloco finally é executado. Já se houver exceções, primeiramente é finalizado o bloco catch adequado para tratar essa exceção e, em seguida, o bloco finally é executado.
Importante dizer que o uso do bloco finally é opcional. Em determinadas situações, o bloco catch também não é necessário, por isso, pode ser que encontremos um bloco try seguido de um bloco finally em um código.
Veja o exemplo a seguir:
StreamWriter objQualquer = new StreamWriter("teste.txt");
try
{
objQualquer.WriteLine("Digitando algo...");
}
catch
{
lblMensagem.Text = "Erro ao digitar...";
}
finally
{
objQualquer.Close();
}
Reparem que a variável objQualquer foi declarada fora do bloco try. Se fosse declarada dentro, ela não seria visível dentro do finally porque apenas estaria dentro do escopo de visibilidade do bloco try.
Na próxima parte veremos a classe Exception, suas derivadas e suas propriedades.