TOC

This article has been localized into Vietnamese by the community.

Một ứng dụng WPF:

Bắt lỗi trong WPF

Nếu bạn đã làm quen với C# hoặc bất kì ngôn ngữ .NET nào khác thì bắt lỗi sẽ không còn là gì mới với bạn. Khi bạn có các dòng code mà có thể đưa ra lỗi, hãy bọc nó trong câu lệnh try-catch và bắt lỗi khi xảy ra. Hãy xem qua ví dụ này:

private void Button_Click(object sender, RoutedEventArgs e)
{
	string s = null;
	s.Trim();
}

Chắc chắc các dòng code này sẽ lỗi bởi vì bạn muốn dùng phương thức Trim() trên một biến có giá trị null. Nếu bạn không bắt lỗi, ứng dụng của bạn sẽ bị ngừng (crash) và Windows sẽ đưa ra vấn đề cần giải quyết. Như bạn thấy, nó không dễ chịu chút nào:

Trong trường hợp này, người dùng phải ép buộc tắt ứng dụng mặc dù rất đơn giản và dễ dàng để tránh lỗi này. Vì vậy, nếu bạn nghĩ có thể sẽ có lỗi, hãy đặt đoạn code đó bên trong khối lệnh try-catch như thê này:

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);
	}
}

Tuy nhiên, thỉnh thoảng các đoạn code đơn gian có thể đưa ra lỗi, thay vì đặt mỗi dòng code trong một khối lệnh try-catch thì WPF cho phép bạn bắt tất cả các lỗi một các tổng quát hơn. Nó sẽ hoàn thành thông qua sự kiện DispatcherUnhandledException trong lớp Application. Nếu đã chấp nhận phương thức bắt lỗi thông qua sự kiện DispatcherUnhandledException trong lớp Application, WPF sẽ gọi phương thức đó mỗi khi lỗi được đưa ra mà bạn chưa bắt lỗi đó trong code. Sau đây là ví dụ hoàn chỉnh dựa trên ví dụ đã cho ở trên:

<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();
		}
	}
}

Để ý ràng tôi đã gọi phương thức Trim() nhiều lần, kể cả bên ngoài khối try-catch. Lần thứ nhất đã được bắt lỗi trong khi lần thứ hai thì không. Trong lần gọi thứ hai, chúng ta hãy xem điều kì diệu từ 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.Warning);
			e.Handled = true;
		}
	}
}

Chúng ta đã bắt lỗi hơn cả ở cục bộ, nhưng có sự khác biệt nhỏ ở phần thông báo và hình ảnh trong message box mặc dù tôi đã đặt e.Handled là true. Nó nói với WPF rằng chúng ta đã xử lý bắt lỗi và không còn gì khác để làm cho nó.

Tổng kết

Bắt lỗi là phần rất quan trọng trong bất kì ứng dụng nào và may mắn thay, WPF và .NET đã làm nó dễ dàng hơn để bắt lỗi cả ở cục bộ lần toàn thể. Bạn nên bắt lỗi cục bộ khi bạn phán đoán được và chỉ sử dụng bắt lỗi toàn cục là phương án dự phòng, khi bạn chưa biết và chưa thể bắt được các lỗi đặc biệt và đặc trưng theo nhiều cách khác nhau.

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!