This article is currently in the process of being translated into Indonesian (~96% done).
Handling exceptions in WPF
Apabila Anda sudah terbiasa dengan bahasa C# ataupun bahasa berbasis .NET lainnya di mana Anda menggunakan WPF, maka penanganan exception bukanlah perkara yang asing bagi Anda: Kapanpun Anda membuat secarik kode yang mungkin dapat menyebabkan exception, tentu Anda harus menuliskannya di dalam blok try-catch agar exception-nya tertangani dengan baik. Coba perhatikan contoh berikut:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Tentu saja kode di atas akan terjadi kesalahan, karena saya mencoba untuk melakukan method Trim() pada variabel yang sedang null. Jika anda tidak menangani exception yang akan terjadi, aplikasi anda akan crash dan Windows yang harus mengatasi masalah tersebut. Seperti yang bisa anda lihat di bawah, kejadian ini tentu saja tidak nyaman untuk user:
Dalam kasus ini, user akan dipaksa untuk menutup aplikasi anda, hanya karena suatu kesalahan yang amat simpel dan mudah dihindari. Jadi, jika anda mengetahui bahwa mungkin akan terjadi sesuatu yang salah, maka anda harus menggunakan blok try-catch, seperti di bawah ini:
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);
}
}
Hanya saja, seringkali kode yang simpel sekali pun dapat melempar suatu exception, dan daripada membungkus setiap baris kode anda dengan blok try-catch, WPF memberikan anda cara untuk mengatasi semua exception yang tidak diatasi, secara global di aplikasi anda. Caranya ialah melalui event DispatcherUnhandledException pada class Application. Jika anda mendaftar pada event tersebut, WPF akan memanggil method yang mendaftar ketika terjadi suatu exception yang tidak anda tangani sendiri di kode. Berikut adalah contoh lengkap, berdasarkan hal-hal yang telah kita pelajari barusan:
<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();
}
}
}
Perhatikan, saya memanggil method Trim() sekali lagi, di luar blok try-catch, panggilan pertama ditangani pada kode secara manual, sementara panggilan kedua tidak. Untuk panggilan kedua kita butuh keajaiban 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;
}
}
}
Kita menangani exception nya hampir sama seperti yang terjadi pada kode, tetapi dengan text dan gambar yang sedikit berbeda di kotak pesan. Juga, perhatikan bahwa saya mengubah properti e.Handled menjadi true. Itu untuk memberitahu WPF bahwa kita sudah selesai menangani exception dan tidak ada lagi yang perlu dilakukan dengan exception nya.
Ringkasan
Penanganan exception adalah sebuah bagian yang sangat penting dari suatu aplikasi dan untungnya, WPF dan .NET membuat ini jadi sangat mudah baik secara lokal di kode maupun secara global. Anda dapat menangani exception secara lokal dimana masuk akal dan memungkinkan, dan menggunakan penanganan global hanya sebagai mekanisme cadangan, karena penanganan lokal memungkinkan anda untuk mengatasi masalah yang terjadi secara lebih spesifik dan terspesialisasi.