Tải bản đầy đủ (.pdf) (8 trang)

Chương 9: Bẫy lỗi và sử dụng cấu trúc xử lý lỗi pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (121.93 KB, 8 trang )


ớ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
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.
1.2. Các l
ỗi về đ
ường dẫn và ổ đĩa

ớ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:

ớ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
Try…Catch nên khi ch
ạy chươn
g 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.

ớ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
Try…Catch 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 Try…Catch 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
Try…Catch l
ồng nhau
- Cùng với đối tượng Err cho phép xác định lỗi phát sinh
Đ
ối

ợ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

ớ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.


ớ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 Try…Catch 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:

ớ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
Try…Catch l
ồng nhau

B
ạn có thể sử dụng các khối Try…Catch 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 Try…Catch 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
Try…Catch. 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 Try…Catch.
Nó giúp b
ạn thoát khỏi khối Try…Catch
khi mu
ốn.

ớ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 Try…Catch 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 Try…Catch 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 Try…Catch để 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.

×