TOC

This article has been localized into Portuguese by the community.

Uma aplicação WPF:

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.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!