• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Bẫy lỗi và Thông báo lỗi (Error Numbers)

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4753
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 13 time
Been thanked: 509 time

Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi truongphu » T.Sáu 16/05/2008 9:56 am

Tên bài viết: Bẫy lỗi và Thông báo lỗi (Error Numbers)
Tác giả: truongphu & Sưu tầm
Cấp độ bài viết: Căn bản
Tóm tắt: Bẫy lỗi và Thông báo lỗi (Error Numbers)


A- Bẫy lỗi
Cách 1:
On Error GoTo <Tên nhãn>
<Các câu lệnh có thể gây ra lỗi>
- Nếu một lệnh trong <Các câu lệnh có thể gây ra lỗi> thì khi chương trình thực thi đến câu lệnh đó, chương trình sẽ tự động bỏ qua câu lệnh bị lỗi và nhảy nhanh tới nhãn lỗi.
Cách 1 nầy thường sử dụng khi ta lường trước lỗi, vd: sai đường dẫn tập tin.
Kết thúc các câu lệnh ở trên, nên thoát khỏi Sub (Function) để nếu không có lỗi thì máy tính không thi hành các lệnh trong nhãn lỗi: nếu là các lệnh đặc biệt, vd MsgBox...
Exit Sub (Function)
(Đương nhiên, nếu nhãn lỗi chỉ có chứa lệnh Exit Sub thì câu trên khỏi viết)

<Tên nhãn>: Để cuối Sub (Function)
<Các câu lệnh xử lý lỗi>
vd: If Err.Number<>0 then MsgBox "Error!"
vd: End
End Sub (Function)

Trong một sub (function), ta có thể đặt nhiều bẫy lỗi nêu trên.

Cách 2:
On Error Resume Next
<Các câu lệnh có thể gây ra lỗi>
- Nếu một lệnh trong <Các câu lệnh có thể gây ra lỗi> thì khi chương trình thực thi đến câu lệnh đó, chương trình sẽ tự động bỏ qua câu lệnh bị lỗi và thực thi câu lệnh kế tiếp.
Thông thường, nếu không dự đoán lỗi xảy ra, chúng ta hay dùng cách 2 nầy, đương nhiên là "yếu cơ?" hơn cách 1

B- Thông báo lỗi (Error Numbers)
Code sau đây sưu tầm trên mạng. Gồm List1, 3 command 1, 2 và 3.
Tôi có bổ sung dòng 13: On Error Resume Next
Điều kỳ diệu là chỉ bấy nhiêu code, Khai thác thư viện "kernel32" để ra một trời Error Numbers!

Mã: Chọn hết

  1. Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
  2. Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  3. Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
  4. Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
  5. Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800
  6. Dim hMod As Long
  7.  
  8. Private Function ApiErrorText(ByVal ErrNum As Long) As String
  9.    Dim msg As String
  10.    Dim nRet As Long
  11.    msg = Space$(1024)
  12.    nRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, ErrNum, 0&, msg, Len(msg), ByVal 0&)
  13.    If nRet Then
  14.    On Error Resume Next 'thêm vào vì test o' nhà có lôi ngay câu sau
  15.       ApiErrorText = Left$(msg, nRet - 2)
  16.    Else
  17.       ApiErrorText = ""
  18.    End If
  19. End Function
  20.  
  21. Private Function VBErrorText(ByVal ErrNum As Long) As String
  22.    VBErrorText = Error(ErrNum)
  23. End Function
  24.  
  25. Private Function InetErrorText(ByVal ErrNum As Long) As String
  26.    Dim msg As String
  27.    Dim nRet As Long
  28.    msg = Space$(1024)
  29.    nRet = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, ByVal hMod, ErrNum, 0&, msg, Len(msg), ByVal
  30.  
  31. 0&)
  32.    If nRet Then
  33.       InetErrorText = Left$(msg, nRet - 2)
  34.    Else
  35.       InetErrorText = ""
  36.    End If
  37. End Function
  38.  
  39. Private Sub Command1_Click()
  40.    Me.Caption = "API Errors"
  41.    Dim strErr As String
  42.    List1.Clear
  43.    Me.MousePointer = vbHourglass
  44.    For i = 1 To 6200
  45.       strErr = RemoveCrLf(ApiErrorText(i))
  46.       If strErr <> "" Then List1.AddItem CStr(i) & ": " & strErr
  47.    Next i
  48.    Me.MousePointer = 0
  49. End Sub
  50.  
  51. Private Sub Command2_Click()
  52.    Me.Caption = "VB Errors"
  53.    Dim strErr As String
  54.    List1.Clear
  55.    Me.MousePointer = vbHourglass
  56.    For i = 1 To 1000
  57.       strErr = VBErrorText(i)
  58.       If Left$(strErr, 11) <> "Application" Then List1.AddItem CStr(i) & ": " & strErr
  59.    Next i
  60.    Me.MousePointer = 0
  61. End Sub
  62.  
  63. Private Function RemoveCrLf(SrcStr As String) As String
  64.    Dim pos As Integer, tmpStr As String
  65.    pos = 1
  66.    RemoveCrLf = SrcStr
  67.    Do
  68.      pos = InStr(pos, RemoveCrLf, Chr$(13))
  69.      If pos Then RemoveCrLf = Left$(RemoveCrLf, pos - 1) & " " & Mid$(RemoveCrLf, pos + 2)
  70.    Loop While pos <> 0
  71. End Function
  72.  
  73. Private Sub Command3_Click()
  74.    Dim strErr As String
  75.    Me.Caption = "Inet Errors"
  76.    hMod = LoadLibrary("wininet.dll")
  77.    List1.Clear
  78.    Me.MousePointer = vbHourglass
  79.    For i = 12000 To 12200
  80.       strErr = RemoveCrLf(InetErrorText(i))
  81.       If strErr <> "" Then List1.AddItem CStr(i) & ": " & strErr
  82.    Next i
  83.    FreeLibrary hMod
  84.    Me.MousePointer = 0
  85. End Sub


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi clarkkent » T.Bảy 17/05/2008 2:09 pm

Có phải dùng

Mã: Chọn hết

  1. On error Goto 0

để tắt xử lý lỗi không bác truongphu... :D
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4753
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 13 time
Been thanked: 509 time

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi truongphu » T.Bảy 17/05/2008 3:54 pm

đúng như thế, vì ít dùng trong VB6 nên tôi không viết (hình như chuyên dùng cho .Net?). Toàn bộ là: 4 cách:

Mã: Chọn hết

  1. On Error (Goto : * line * 0  * -1 *) Resume Next
. Lưu ý Resume là một command

line: nhãn lỗi chứa các lệnh thi hành.
Riêng 2 số 0 và -1 không được xem là nhãn lỗi.

0: tắt các lệnh On Error (Disables enabled error handler in the current procedure and resets it to Nothing.)
-1: (Disables enabled exception in the current procedure and resets it to Nothing)

Còn gặp:
ErrorExit
là công việc sau khi thực hiện nhãn lỗi và trước khi thoát khỏi Sub (function). ErrorExit đặt trước Nhãn lỗi.

Ngoài ra người ta còn dùng

Mã: Chọn hết

  1. If Err.Number <> 0 Then ...

cảm ơn clarkkent
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4753
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 13 time
Been thanked: 509 time

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi truongphu » T.Tư 14/01/2009 5:19 am

Trong nhiều chương trình, để bảo đảm chương trình chính vẫn chạy dù có lỗi tí chút, người ta hay dùng lệnh trong sub hay function:

Mã: Chọn hết

  1. On Error Resume Next

Thế thì biết lỗi gì nữa?

Ta có thể dùng thủ thuật sau:
* Đánh số từng dòng. sau mỗi số có dấu ":" = để cho phép viết tiếp thay vì xuống dòng
* Gọi biến Erl
Code minh họa:

Mã: Chọn hết

  1. Private Sub Form_Load()
  2. 1: On Error Resume Next
  3. 2: Dim a As Integer
  4. 3: Dim b As Integer
  5. 4: a = 555
  6. 5: b = a * 1000
  7. 6: MsgBox Erl
  8. End Sub
  9.  
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4753
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 13 time
Been thanked: 509 time

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi truongphu » T.Năm 08/10/2009 9:08 pm

truongphu đã viết:On Error Resume Next

Thế thì biết lỗi gì nữa?
Ta có thể dùng thủ thuật sau:
* Đánh số từng dòng. sau mỗi số có dấu ":" = để cho phép viết tiếp thay vì xuống dòng
* Gọi biến Erl


Khi đang viết chương trình, ta có thể tắt câu "On Error Resume Next"
và nếu có lỗi, debug màu vàng hiện ra....
Nhưng khi thực thi một chương trình ngoài, lỗi sẽ không đem lại kết quả mong muốn và hiển thị lỗi
Đó là trường hợp tôi gọi máy in
Để tìm lỗi khi sửa bài "In khổ A4 gì đấy..."
tôi đã dùng kỹ thuật nầy để tìm bug
kết quả thật tốt

Sau đây là sub bẫy lỗi của ADODC tôi viết để chạy cho có vẻ Advance! :D

Mã: Chọn hết

  1. Private Sub Command10_Click() '<-- Sub u'ng dung
  2. On Error GoTo Lôi
  3. rec.Close
  4. rec.Open "INSERT INTO table2 SELECT sbd FROM Table1 WHERE diem2=5"
  5. 'DataGrid1.ReBind
  6. Lôi: Errors  '<-- không ghi Exit Sub dòng trên
  7. End Sub
  8.  
  9. Private Sub Errors() ' Sub nây là Code chính bâ~y lô~i, Ðê dùng chung cho nhiê`u Sub hay function
  10. If Err.Number = 0 Then
  11. MsgBox "Ðã Xong"
  12. Else
  13. MsgBox "Error: " & Err.Number & vbCr & _
  14. " " & Err.Description
  15. End If
  16. End Sub


Bạn thử xem sao
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

dientai
Bài viết: 3
Ngày tham gia: CN 27/02/2011 5:03 pm

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi dientai » CN 20/03/2011 5:34 pm

  1. top:
  2.     X = nPHI Mod nE
  3.     Y = X Mod nE
  4.     If Y <> 0 And IsPrime(nE) Then
  5.         GCD = nE
  6.         Exit Function
  7.     Else
  8.         nE = nE + 1
  9.     End If
  10.    
  11.     GoTo top

cho mình hỏi top,go to top là sao.thanks
----
[mod=]Nhớ đưa code vào thẻ[/mod]
Sửa lần cuối bởi truongphu vào ngày CN 20/03/2011 7:49 pm với 2 lần sửa.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4753
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 13 time
Been thanked: 509 time

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi truongphu » CN 20/03/2011 7:48 pm

dientai đã viết:cho mình hỏi top,go to top là sao.thanks

GoTo _ viết dính liền
là hàm nhảy tới dòng code nào đó
dientai đã viết:top

top không có ý nghĩa gì cả, muốn đặt tên gì cũng được (không phải top là đỉnh. tác giả đặt tên 'top' để gợi nhớ hay ý nghĩa gì đó liên quan đến đầu tiên)

GoTo top là nhảy ngay đến dòng code có khai báo top
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

dientai
Bài viết: 3
Ngày tham gia: CN 27/02/2011 5:03 pm

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi dientai » CN 20/03/2011 9:16 pm

thanks bác truong,em hiểu rồi,cái goto và to trên giống như vòng lặp không điều kiện,và có lệnh Exit Function như là lệnh break trong C

Hình đại diện của người dùng
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Bài viết: 1259
Ngày tham gia: T.Năm 03/06/2010 9:23 pm
Đến từ: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 time
Been thanked: 137 time
Liên hệ:

Re: Bẫy lỗi và Thông báo lỗi (Error Numbers)

Gửi bàigửi bởi VuVanHoanh » T.Sáu 15/04/2011 11:24 am

Chà chà, sao cháu tìm trong VBLib chưa có biến số Err nhỉ?
Err - Đối tượng chứa các thông tin về lỗi gặp phải khi debug (theo cháu tạm hiểu) :)
Đối tượng Err có chứa các biến số và phương thức sau:
Clear: Xóa mọi thông tin về lỗi, đưa các biến số trong Err về giá trị mặc định như không có lỗi
Description: Mô tả lỗi gặp phải:
Thử xem nào: 1Textbox
  1. Private Sub Command1_Click()
  2.     On Error GoTo Ferr
  3.     Dim i As Integer
  4.     i = Text1.Text
  5.     MsgBox i
  6.     Exit Sub
  7. Ferr:
  8.     MsgBox Err.Description
  9. End Sub

Giả sử nhập số vào Textbox thì OK
Nhưng nếu nhập chữ thì hiện thông báo Type mismatch
HelpFile: hiện tên tệp trợ giúp (*.hlp)
Number: Mã số của lỗi. VD: Lỗi Type mismatch có mã số lỗi là 13
Bảng liệt kê mã số lỗi thường gặp trong lập trình:
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
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
Raise: Phát sinh thêm một lỗi khi đang chạy ct. :) Sử dụng mã lỗi ở trên kè kè ;))
Source: Xem hay thay đổi nguồn dính lỗi (project,...)
Since 2008...
One love! :x


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách