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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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ỗi Biên so ạn: Phạm Đức Lập - 1 - Add: cnt-44-dh, VIMARU Chương 9: Bẫy lỗi sử dụng cấu trúc xử lỗi oOo N ội dung thảo luận: - Qu ản 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 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ỗ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ỗ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 ỗ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 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 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ỗ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ử 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ử 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 ổ đĩ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ỗ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ỗi runtime thư ờng thấy nhất. Chúng ta t ạo một form có nút nhấn 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 thiết kế form như hình: Vi ết mã: T ạo thủ tục Button1_Click 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ỗi Biên so ạn: Phạm Đức Lập - 3 - Add: cnt-44-dh, VIMARU 2. Cài đ ặt cơ chế xử 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 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ỗ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 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 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ỗ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 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ỗ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 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) 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 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: 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ỗ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òng l ặp For, Do Loop. 3. So sánh cơ chế xử 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 ỗ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 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. 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ỗ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 dùng khối Try…Catch để xử 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. . 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ý. 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. 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:

Ngày đăng: 22/06/2014, 04:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan