WPF - Tratamento de exceções
Uma exceção é qualquer condição de erro ou comportamento inesperado encontrado durante a execução de um programa. Exceções podem ser levantadas por vários motivos, alguns deles são os seguintes -
Falha em seu código ou no código que você chama (como uma biblioteca compartilhada),
Recursos indisponíveis do sistema operacional,
Condições inesperadas que um common language runtime encontra (como código que não pode ser verificado)
Sintaxe
As exceções têm a capacidade de transferir o fluxo de um programa de uma parte para outra. No .NET framework, o tratamento de exceções tem as seguintes quatro palavras-chave -
try - Neste bloco, o programa identifica uma determinada condição que levanta alguma exceção.
catch- A palavra-chave catch indica a captura de uma exceção. UMAtry bloco é seguido por um ou mais catch blocos para capturar uma exceção com um tratador de exceção no local de um programa onde você deseja tratar o problema.
finally- O bloco finally é usado para executar um determinado conjunto de instruções, seja uma exceção lançada ou não. Por exemplo, se você abrir um arquivo, ele deve ser fechado, independentemente de haver ou não uma exceção.
throw- Um programa lança uma exceção quando um problema aparece. Isso é feito usando uma palavra-chave throw.
A sintaxe para usar essas quatro palavras-chave é a seguinte -
try {
///This will still trigger the exception
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
finally {
// statements to be executed
}
Várias instruções catch são usadas nos casos em que um bloco try pode gerar mais de uma exceção, dependendo da situação de um fluxo de programa.
Hierarquia
Quase todas as classes de exceção na estrutura .NET são derivadas direta ou indiretamente da classe Exception. As classes de exceção mais importantes derivadas da classe Exception são -
ApplicationException class- Suporta exceções geradas por programas. Quando o desenvolvedor deseja definir a exceção, a classe deve ser derivada desta classe.
SystemException class- É a classe base para todas as exceções de sistema de tempo de execução predefinidas. A hierarquia a seguir mostra as exceções padrão fornecidas pelo tempo de execução.
A tabela a seguir lista as exceções padrão fornecidas pelo tempo de execução e as condições sob as quais você deve criar uma classe derivada.
Tipo de exceção | Tipo de base | Descrição |
---|---|---|
Exception | Objeto | Classe base para todas as exceções. |
SystemException | Exceção | Classe base para todos os erros gerados pelo tempo de execução. |
IndexOutOfRangeException | SystemException | Lançado pelo tempo de execução apenas quando uma matriz é indexada incorretamente. |
NullReferenceException | SystemException | Lançado pelo tempo de execução apenas quando um objeto nulo é referenciado. |
AccessViolationException | SystemException | Lançado pelo tempo de execução apenas quando a memória inválida é acessada. |
InvalidOperationException | SystemException | Lançado por métodos quando em um estado inválido. |
ArgumentException | SystemException | Classe base para todas as exceções de argumento. |
ArgumentNullException | ArgumentException | Lançado por métodos que não permitem que um argumento seja nulo. |
ArgumentOutOfRangeException | ArgumentException | Lançado por métodos que verificam se os argumentos estão em um determinado intervalo. |
ExternalException | SystemException | Classe base para exceções que ocorrem ou são destinadas a ambientes fora do tempo de execução. |
SEHException | Exceção externa | Exceção que encapsula informações de manipulação de exceção estruturada do Win32. |
Exemplo
Vamos dar um exemplo simples para entender melhor o conceito. Comece criando um novo projeto WPF com o nomeWPFExceptionHandling.
Arraste uma caixa de texto da caixa de ferramentas para a janela de design. O código XAML a seguir cria uma caixa de texto e a inicializa com algumas propriedades.
<Window x:Class = "WPFExceptionHandling.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:WPFExceptionHandling"
mc:Ignorable = "d"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<TextBox x:Name = "textBox" HorizontalAlignment = "Left"
Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap"
VerticalAlignment = "Top" Width = "453"/>
</Grid>
</Window>
Aqui está a leitura do arquivo com tratamento de exceção em C #.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Quando você compila e executa o código acima, ele irá produzir a seguinte janela na qual um texto é exibido dentro da caixa de texto.
Quando há uma exceção levantada ou você a lança manualmente (como no código a seguir), ele mostrará uma caixa de mensagem com erro.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
throw new Exception();
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Quando uma exceção é levantada durante a execução do código acima, ele exibirá a seguinte mensagem.
Recomendamos que você execute o código acima e experimente seus recursos.