This article has been localized into Portuguese by the community.
Manipulando exceções no WPF
Se você está familiarizado com C# ou qualquer outra linguagem .NET que pode ser usada com WPF, então manipular exceções não deve ser novidade para você: Sempre que você tem um trecho de código que aparentemente irá lançar uma exceção, você deve envolvê-lo em um bloco try-catch para manipular a exceção. Por exemplo, considere este exemplo:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Obviamente isso vai dar errado, visto que eu tentei executar o método Trim() em uma variável que era nula. Se você não manipular a exceção, sua aplicação irá quebrar e o Windows terá que lidar com o problema. Como você pode ver, isso não é muito amigável para o usuário:
Neste caso, o usuário deve forçar o fechamento da aplicação, devido ao tal erro simples e evitável. Então, se você sabe que coisas como essas podem dar errado, você deve usar um bloco try-catch, como este:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
No entanto, algumas vezes mesmo um simples código pode disparar uma exceção, e ao invés de cobrir cada linha de código com um bloco try-catch, WPF te permiterá manipular todas exceções não-manipuladas globalmente. Isto é feito através do evento DispatcherUnhandledException na classe Application. Se assinado, o WPF irá chamar o método inscrito uma vez que uma exceção não-manipulada no seu código seja lançada. Aqui temos um exemplo completo, baseado no que acabamos de ver:
<Window x:Class="WpfTutorialSamples.WPF_Application.ExceptionHandlingSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ExceptionHandlingSample" Height="200" Width="200">
<Grid>
<Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click">
Do something bad!
</Button>
</Grid>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ExceptionHandlingSample : Window
{
public ExceptionHandlingSample()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
s.Trim();
}
}
}
Note que eu chamei o método Trim() uma vez a mais, fora do bloco try-catch, então a primeira chamada é manipulada, enquanto a segunda não. Para o segundo, nós precisamos da mágica do App.xaml:
<Application x:Class="WpfTutorialSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException"
StartupUri="WPF Application/ExceptionHandlingSample.xaml">
<Application.Resources>
</Application.Resources>
</Application>
using System;
using System.Windows;
namespace WpfTutorialSamples
{
public partial class App : Application
{
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true;
}
}
}
Nós manipulamos a exceção local bem parecida, mas com uma leve diferença de texto e imagem na caixa de mensagem. Note também que eu defini a propriedade e.Handled como verdadeira. Isso diz ao WPF que nós tratamos a exceção e nada mais precisa ser feito sobre ela.
Resumo
Manipulação de exceções é uma parte muito importante de qualquer aplicação e felizmente, WPF e .NET torna isso muito fácil de fazer tanto localmente quanto globalmente. Você deve manipular exceções localmente quando isso fizer sentido e apenas usar a manipulação global como um mecanismo reserva, visto que manipulação local te permite ser mais específico e tratar o problema de um jeito mais especialista.