Bài giảng Hướng dẫn lập trình VB.NET - Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi - Phạm Đức Lập

Nội dung thảo luận:

- Quản lý các lỗi thực thi chương trình bằng phát biểu Try Catch.

- Kiểm tra một số điều kiện lỗi đặc trưng bằng phát biểu Catch When

- Sử dụng thuộc tính Err.Number và Err.Description để xác định các lỗi ngoại lệ

- Sử dụng phát biểu Try Catch

- Sử dụng các bộ xử lý lỗi kết hợp với các kỹ thuật phòng vệ lỗi khác

- Thoát khỏi bộ xử lý lỗi bằng phát biểu Exit Try

Chương này chúng ta sẽ xây dựng các khối mã tự xử lý lỗi phát sinh, còn gọi là các ngoại

lệ. Ta dùng khối Try Catch để bẫy những lỗi này và làm nó không ảnh hưởng đến luồng

thực thi.

Các tính năng mới của bắt lỗi trong VB.NET:

- Phát biểu Catch When cho phép kiểm tra một số lỗi đặc trưng ngay trong khối

Try Catch

- Phát biểu Exit Try cho phép ta thoát khỏi khối bất cứ lúc nào

- Các đối tượng Err và thuộc tính Err.Number, Err.Description cho phép xác định

mã lỗi. Phương thức mới Err.GetException trả về thông tin của lỗi ngoại lệ phát sinh.

1. Xử lý lỗi sử dụng cú pháp Try Catch

Lỗi có thể phát sinh bất cứ lúc nào. Ví dụ như khi bạn nạp một file mà không có thực trong

đĩa thì chương trình sẽ gặp lỗi. VB có khả năng xử lý nhưng nhiệm vụ của bạn là phải

thông báo cho VB biết. Chính vì thế khối lệnh Try Catch sẽ bao bọc đoạn mã lệnh có khả

năng gây ra lỗi cho chương trình. Thông thường có các lỗi xảy ra do nhập xuất dl, phép

chia cho 0, thiết bị ngoại vi không sẵn sàng.

1.1. Cú pháp Try Catch

Try

Các phát biểu có thể gây lỗi

Catch

Các phát biểu xử lý nếu có lỗi phát sinh

Finally

Các phát biểu được gọi ngay cả khi có hay không có lỗi

End Try

Trong đó Finally là tùy chọn, các từ khóa còn lại là bắt buộc.

pdf 8 trang yennguyen 1380
Bạn đang xem tài liệu "Bài giảng Hướng dẫn lập trình VB.NET - Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi - Phạm Đức Lập", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Hướng dẫn lập trình VB.NET - Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi - Phạm Đức Lập

Bài giảng Hướng dẫn lập trình VB.NET - Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi - Phạm Đức Lập
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 1 - Add: cnt-44-dh, VIMARU 
Chương 9: 
Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
--------oOo-------- 
Nội dung thảo luận: 
 - Quản lý các lỗi thực thi chương trình bằng phát biểu TryCatch. 
 - Kiểm tra một số điều kiện lỗi đặc trưng bằng phát biểu Catch When 
 - Sử dụng thuộc tính Err.Number và Err.Description để xác định các lỗi ngoại lệ 
 - Sử dụng phát biểu TryCatch 
 - Sử dụng các bộ xử lý lỗi kết hợp với các kỹ thuật phòng vệ lỗi khác 
 - Thoát khỏi bộ xử lý lỗi bằng phát biểu Exit Try 
Chương này chúng ta sẽ xây dựng các khối mã tự xử lý lỗi phát sinh, còn gọi là các ngoại 
lệ. Ta dùng khối TryCatch để bẫy những lỗi này và làm nó không ảnh hưởng đến luồng 
thực thi. 
Các tính năng mới của bắt lỗi trong VB.NET: 
 - Phát biểu Catch When cho phép kiểm tra một số lỗi đặc trưng ngay trong khối 
TryCatch 
 - Phát biểu Exit Try cho phép ta thoát khỏi khối bất cứ lúc nào 
 - Các đối tượng Err và thuộc tính Err.Number, Err.Description cho phép xác định 
mã lỗi. Phương thức mới Err.GetException trả về thông tin của lỗi ngoại lệ phát sinh. 
1. Xử lý lỗi sử dụng cú pháp TryCatch 
Lỗi có thể phát sinh bất cứ lúc nào. Ví dụ như khi bạn nạp một file mà không có thực trong 
đĩa thì chương trình sẽ gặp lỗi. VB có khả năng xử lý nhưng nhiệm vụ của bạn là phải 
thông báo cho VB biết. Chính vì thế khối lệnh TryCatch sẽ bao bọc đoạn mã lệnh có khả 
năng gây ra lỗi cho chương trình. Thông thường có các lỗi xảy ra do nhập xuất dl, phép 
chia cho 0, thiết bị ngoại vi không sẵn sàng. 
1.1. Cú pháp TryCatch 
Try 
 Các phát biểu có thể gây lỗi 
Catch 
 Các phát biểu xử lý nếu có lỗi phát sinh 
Finally 
 Các phát biểu được gọi ngay cả khi có hay không có lỗi 
End Try 
Trong đó Finally là tùy chọn, các từ khóa còn lại là bắt buộc. 
1.2. Các lỗi về đường dẫn và ổ đĩa 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 2 - Add: cnt-44-dh, VIMARU 
Ví dụ sau DiskDriverError sẽ minh họa tình huống xử lý lỗi runtime thường thấy nhất. 
Chúng ta tạo một form có nút nhấn và một ô ảnh PictureBox. Khi click vào nút thì ảnh 
trong một đĩa mềm có tên 6_82MELINH.ico sẽ load vào ô ảnh. Nếu bỏ đĩa mềm ra khỏi ổ 
mềm thì chạy chương trình sẽ báo lỗi không tìm thấy đĩa trong ổ A:\ ngay. 
Thiết kế Form: 
Bạn mở mới một dự án và thiết kế form như hình: 
Viết mã: 
Tạo thủ tục Button1_Click và gõ mã như sau: 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
Lúc này trong ổ mềm không có đĩa nên khi chạy chương trình sẽ có thông báo lỗi xảy ra 
Để khắc phục ta đặt thêm khối try  catch vào như thế này: 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 3 - Add: cnt-44-dh, VIMARU 
2. Cài đặt cơ chế xử lý lỗi đọc đĩa 
Bạn sửa lại thủ tục Button1_click như sau: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch ex As Exception 
 MsgBox("Không tìm thấy đĩa mềm ở ổ A:\") 
 End Try 
Lúc này phát biểu gây lỗi PictureBox1.Image = System.Drawing.Image.FromFile _ 
đã được đặt ở trong khối TryCatch nên khi chạy chương sẽ thực thi hiện thông báo thay 
vì phát sinh lỗi như trên: 
2.1. Sử dụng mệnh đề Finally để thực hiện tác vụ dọn dẹp 
Mệnh đề này sẽ cho phép dùng các phát biểu sau nó dù có hay không có lỗi xảy ra. Nó 
thuận tiện khi bạn muốn dọn dẹp lỗi, giá trị của biến, thuộc tính khi bạn thực thi đoạn mã 
bảo vệ xong. 
Trở lại ví dụ trên, ta thêm vào đoạn mã như sau: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch ex As Exception 
 MsgBox("Không tìm thấy đĩa mềm ở ổ A:\") 
 Finally 
 MsgBox("Đã bắt lỗi thành công.") 
 End Try 
Và chạy lại chương trình để xem nó hoạt động như thế nào. 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 4 - Add: cnt-44-dh, VIMARU 
2.2. Cài đặt TryCatch phức tạp hơn 
Khi chương trình phức tạp thì việc bắt lỗi cũng trở nên phức tạp hơn. Với TryCatch bạn 
có thể: 
 - Đặt một khối hay nhiều khối phát biểu giữa các từ khóa. 
 - Cho phép sử dụng mệnh đề lọc lỗi Catch When 
 - Cho phép sử dụng khối TryCatch lồng nhau 
 - Cùng với đối tượng Err cho phép xác định lỗi phát sinh 
Đối tượng Err: 
Đây là đối tượng đặc biệt cung cấp chi tiết thông tin lỗi phát sinh. Các thuộc tính thông 
dụng Err.Number, Err.Description chứa thông tin mã lỗi, mô tả chi tiết lỗi. Phương thức 
Err.Clear cho phép xóa bỏ lỗi hiện hành. Bảng sau đây liệt kê các lỗi Runtime thường gặp 
trong VB: 
Mã lỗi (Err.Number) Mô tả 
5 Gọi hàm hay truyền đối số không đúng 
6 Tràn 
7 Hết bộ nhớ 
9 Truy xuất vượt chỉ số mảng 
11 Chia cho 0 
13 Kiểu không hợp lệ 
48 Lỗi nạp thư viện DLL 
51 Lỗi nội bộ 
52 Tên File hay số không hợp lệ 
53 Không tìm thấy File 
55 File đang mở 
57 Lỗi thiết bị xuất nhập 
58 File đã tồn tại 
61 Đĩa đầy 
62 Con trỏ file vượt quá điểm cuối file 
67 File mở quá nhiều 
68 Thiết bị chưa sẵn sàng 
70 Không cho phép truy xuất 
71 Ổ đĩa chưa sẵn sàng 
75 Truy cập đường dẫn và file không đúng 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 5 - Add: cnt-44-dh, VIMARU 
76 Không thấy đường dẫn 
91 Biến đối tượng thiếu từ khóa truy xuất With 
321 Định dạng file không hợp lệ 
322 Không thể tạo file tạm 
380 Giá trị thuộc tính không hợp lệ 
381 Chỉ số thuộc tính không hợp lệ 
422 Thuộc tính không tìm thấy 
423 Thuộc tính hay phương thức không có 
424 Yêu cầu về đối tượng 
429 Không thể tạo đối tượng ActiveX 
430 Lớp đối tượng không hỗ trợ Automation 
440 Không thể tạo đối tượng Automation 
460 Định dạng trong Clipboard không hợp lệ 
461 Phương thức hay biến thành viên không tìm thấy 
462 Server không sẵn sàng 
463 Lớp không đăng ký trên máy cục bộ 
481 Ảnh không hợp lệ 
482 Máy in bị lỗi 
Bây giờ vẫn dùng ví dụ trên nhưng ta thêm thuộc tính Err.Number, Err.Description đồng 
thời ta cũng tìm hiểu thêm về mệnh đề đọc lỗi Catch When. 
Bạn sửa lại thủ tục Button1_Click như sau: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch When Err.Number = 53 'nếu không thấy file 
 MsgBox("Kiểm tra lại đường dẫn và tên file") 
 Catch When Err.Number = 7 'Hết bộ nhớ 
 MsgBox("File ảnh quá lớn - hết bộ nhớ", , Err.Description) 
 Catch ex As Exception 
 MsgBox("Không tìm thấy đĩa mềm ở ổ A:\", , Err.Description) 
 Finally 
 MsgBox("Đã bắt lỗi thành công.") 
 End Try 
Trong khối lệnh trên ta sử dụng mệnh đề Catch When hai lần, mỗi lần ta sử dụng thêm các 
thuộc tính Number của đối tượng Err để phát hiện lỗi cụ thể hơn. 
Bạn chạy lại chương trình xem nó hoạt động ra sao. 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 6 - Add: cnt-44-dh, VIMARU 
Tự mình phát sinh lỗi: 
Trong một số trường hợp bạn có thể tự kiểm tra lỗi trong mệnh đề Try và muốn nhảy ngay 
đến mệnh đề Catch để lỗi được xử lý. Khi đó VB.NET cung cấp phương thức Err.Raise để 
làm điều đó. Ví dụ ta có thể tự phát hiện ra lỗi không tìm thấy File ở ví dụ trên (lỗi 53) và 
thực hiện phát biểu trong mệnh đề Catch: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 If Err.Number = 53 Then Err.Raise(53) 
 Catch When Err.Number = 53 
 MsgBox("Không tìm File") 
 End Try 
2.3. Xác định số lần thử lại 
Một trong những đặc sắc của TryCatch là cho phép bạn thử lại một số thao tác gây ra lỗi 
trước khi đưa ra quyết định không thực hiện thao tác này nữa. Ví dụ ta có thể xem số lần 
người dùng click vào nút “Load File” bao nhiêu lần, nếu vượt quá số lần cho phép thì 
không cho người dùng click tiếp nữa: 
Khai báo thêm biến dem ở dưới dòng public class form1: 
 Dim dem As Short = 0 
Sửa lại thủ tục Button1_Click như sau: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch ex As Exception 
 dem += 1 
 If dem <= 2 Then 
 MsgBox("Không tìm thấy đĩa mềm ở ổ A:\") 
 Else 
 MsgBox("Không thể load File!") 
 Button1.Enabled = False 
 End If 
 End Try 
Và bây giờ khi người dùng click vào nút “Load File” quá hai lần thì thông báo xuất hiện: 
Và nút “Load File” sẽ bị mờ đi không cho người dùng click nữa như thế này: 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 7 - Add: cnt-44-dh, VIMARU 
2.4. Sử dụng các khối TryCatch lồng nhau 
Bạn có thể sử dụng các khối TryCatch lồng nhau để kiểm tra kép các thao tác có thể gây 
lỗi. Ví dụ bây giờ ta sửa lại ví dụ trên để người dùng phải đưa đĩa mềm vào ổ A:\ ngay từ 
lần thông báo lỗi đầu tiên, nếu không nút “Load File” lập tức sẽ bị vô hiệu hóa. Code: 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch 
 MsgBox("Không tìm thấy đĩa mềm ở ổ A:\, cho đĩa mềm vào") 
 Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch ex As Exception 
 MsgBox("Không thể load file!") 
 Button1.Enabled = False 
 End Try 
 End Try 
Bạn nên sử dụng việc lồng hai phát biểu TryCatch lồng nhau trong trường hợp kiểm tra 
lại lỗi 2 lần. Còn nếu kiểm tra nhiều lần thì bạn nên sử dụng kết hợp với các biến đếm và 
vòng lặp For, Do Loop. 
3. So sánh cơ chế xử lý lỗi với các kỹ thuật phòng vệ lỗi 
Bạn có thể đoán trước xem lỗi nào có thể xảy ra để phòng trước thay vì xử lý lỗi bằng 
TryCatch. Ví dụ trong bài tập trên, thay vì dùng Try ta sẽ dùng phương thức của hệ 
thống là File.Exists kiểm tra xem có tồn tại file hay không rồi mới gọi phương thức nạp 
ảnh FromFile: 
Để dùng được phương thức này, bạn cần khai báo sử dụng thư viện IO bằng từ khóa 
Imports ở đầu khối lệnh: 
 Imports System.IO 
Rồi sửa lại mã lệnh trong thủ tục Button1_Click như sau: 
 'Phòng vệ lỗi 
 If File.Exists("A:\6_82MELINH.ico") Then 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Else 
 MsgBox("Không tồn tại file này!") 
 End If 
Việc sử dụng phương thức nào là do bạn quyết định và trong hoàn cảnh nào thì dùng 
phương thức nào cho hợp lý. 
4. Sử dụng phát biểu thoát Exit Try 
Phát biểu này là tùy chọn trong khối TryCatch. Nó giúp bạn thoát khỏi khối TryCatch 
khi muốn. 
Hướng dẫn lập trình VB.NET Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi 
Biên soạn: Phạm Đức Lập - 8 - Add: cnt-44-dh, VIMARU 
Tuy nhiên nếu trong khối TryCatch có phát biểu Finally thì chương trình sẽ thực thi các 
phát biểu trong phần Finally trước khi thoát khỏi khối Try theo yêu cầu của Ext Try. 
Ví dụ như sau: 
 'Thoát Try với Exit Try 
 Try 
 If PictureBox1.Enabled = False Then Exit Try 
 PictureBox1.Image = System.Drawing.Image.FromFile _ 
 ("A:\6_82MELINH.ico") 
 Catch ex As Exception 
 MsgBox("Không tìm thấy File này!") 
 End Try 
Trong đoạn mã trên, nếu chương trình kiểm tra xem điều khiển PictureBox1 mà chưa sẵn 
sàng thì lập tức thoát khỏi khối TryCatch mà không thực hiện đưa ra thông báo nào. 
5. Tổng kết chương 
Bạn lập bảng tông kết chương và dùng khối TryCatch để xử lý các lỗi có thể gây ra 
trong các bài tập của các chương trước đây. 

File đính kèm:

  • pdfbai_giang_huong_dan_lap_trinh_vb_net_chuong_9_bay_loi_va_su.pdf