WPF - Xử lý ngoại lệ
Ngoại lệ là bất kỳ điều kiện lỗi nào hoặc một hành vi không mong muốn nào gặp phải trong quá trình thực thi chương trình. Các ngoại lệ có thể được đưa ra do nhiều lý do, một số trong số đó là như sau:
Lỗi trong mã của bạn hoặc mã mà bạn gọi (chẳng hạn như thư viện được chia sẻ),
Tài nguyên hệ điều hành không khả dụng,
Các điều kiện không mong muốn mà thời gian chạy ngôn ngữ chung gặp phải (chẳng hạn như mã không thể được xác minh)
Cú pháp
Các ngoại lệ có khả năng chuyển luồng của một chương trình từ phần này sang phần khác. Trong .NET framework, xử lý ngoại lệ có bốn từ khóa sau:
try - Trong khối này, chương trình xác định một điều kiện nhất định làm nảy sinh một số ngoại lệ.
catch- Từ khóa catch cho biết việc bắt một ngoại lệ. Atry khối được theo sau bởi một hoặc nhiều catch để bắt một ngoại lệ với một trình xử lý ngoại lệ tại vị trí trong một chương trình mà bạn muốn xử lý vấn đề.
finally- Khối cuối cùng được sử dụng để thực hiện một tập hợp các câu lệnh đã cho, cho dù một ngoại lệ được ném hay không được ném. Ví dụ: nếu bạn mở một tệp, nó phải được đóng lại cho dù có một ngoại lệ nào được đưa ra hay không.
throw- Một chương trình ném ra một ngoại lệ khi một vấn đề xuất hiện. Điều này được thực hiện bằng cách sử dụng một từ khóa ném.
Cú pháp để sử dụng bốn từ khóa này như sau:
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
}
Nhiều câu lệnh bắt được sử dụng trong những trường hợp khối try có thể tạo ra nhiều hơn một ngoại lệ tùy thuộc vào tình huống của luồng chương trình.
Hệ thống cấp bậc
Hầu hết tất cả các lớp ngoại lệ trong .NET framework đều có nguồn gốc trực tiếp hoặc gián tiếp từ lớp Exception. Các lớp ngoại lệ quan trọng nhất bắt nguồn từ lớp Ngoại lệ là:
ApplicationException class- Nó hỗ trợ các trường hợp ngoại lệ do các chương trình tạo ra. Khi nhà phát triển muốn xác định ngoại lệ thì lớp phải được dẫn xuất từ lớp này.
SystemException class- Nó là lớp cơ sở cho tất cả các ngoại lệ của hệ thống thời gian chạy được xác định trước. Hệ thống phân cấp sau đây cho thấy các ngoại lệ tiêu chuẩn được cung cấp bởi thời gian chạy.
Bảng sau liệt kê các ngoại lệ tiêu chuẩn được cung cấp bởi thời gian chạy và các điều kiện mà bạn nên tạo một lớp dẫn xuất.
Loại ngoại lệ | Loại cơ sở | Sự miêu tả |
---|---|---|
Exception | Vật | Lớp cơ sở cho tất cả các trường hợp ngoại lệ. |
SystemException | ngoại lệ | Lớp cơ sở cho tất cả các lỗi do thời gian chạy tạo ra. |
IndexOutOfRangeException | SystemException | Bị ném bởi thời gian chạy chỉ khi một mảng được lập chỉ mục không đúng cách. |
NullReferenceException | SystemException | Bị ném bởi thời gian chạy chỉ khi một đối tượng rỗng được tham chiếu. |
AccessViolationException | SystemException | Bị ném bởi thời gian chạy chỉ khi bộ nhớ không hợp lệ được truy cập. |
InvalidOperationException | SystemException | Ném bằng các phương thức khi ở trạng thái không hợp lệ. |
ArgumentException | SystemException | Lớp cơ sở cho tất cả các ngoại lệ đối số. |
ArgumentNullException | ArgumentException | Bị ném bởi các phương thức không cho phép một đối số là rỗng. |
ArgumentOutOfRangeException | ArgumentException | Đưa ra bởi các phương pháp xác minh rằng các đối số nằm trong một phạm vi nhất định. |
ExternalException | SystemException | Lớp cơ sở cho các ngoại lệ xảy ra hoặc được nhắm mục tiêu vào các môi trường bên ngoài thời gian chạy. |
SEHException | Trường hợp ngoại lệ | Ngoại lệ đóng gói thông tin xử lý ngoại lệ có cấu trúc Win32. |
Thí dụ
Hãy lấy một ví dụ đơn giản để hiểu khái niệm tốt hơn. Bắt đầu bằng cách tạo một dự án WPF mới với tênWPFExceptionHandling.
Kéo một hộp văn bản từ hộp công cụ vào cửa sổ thiết kế. Mã XAML sau đây tạo một hộp văn bản và khởi tạo nó với một số thuộc tính.
<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>
Đây là cách đọc tệp có xử lý ngoại lệ trong 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();
}
}
}
}
}
Khi bạn biên dịch và thực thi đoạn mã trên, nó sẽ tạo ra cửa sổ sau trong đó văn bản được hiển thị bên trong hộp văn bản.
Khi có một ngoại lệ được nâng lên hoặc bạn ném nó theo cách thủ công (như trong đoạn mã sau), thì nó sẽ hiển thị một hộp thông báo có lỗi.
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();
}
}
}
}
}
Khi một ngoại lệ được đưa ra trong khi thực thi đoạn mã trên, nó sẽ hiển thị thông báo sau.
Chúng tôi khuyên bạn nên thực thi mã trên và thử nghiệm với các tính năng của nó.