Đây là sự hiểu lầm lớn! Có khác biệt quan trọng giữa:
Err.Clear
GoTo CleanUp
và:
Resume CleanUp
KHÔNG BAO GIỜ sử dụng hình thức đầu tiên, luôn luôn sử dụng Resume CleanUp (chỉ). Tiếp tục thực hiện RESET của trạng thái lỗi VB6 nội bộ, do đó khi xảy ra lỗi KHÁC, "Trên nhãn GoTo Error" sẽ được áp dụng. Tôi bạn sử dụng "Err.Clear" thì đối tượng Err bị xóa, nhưng trạng thái lỗi nội bộ KHÔNG được xóa và khi một lỗi khác xuất hiện, nó được coi là mã KHÔNG có bất kỳ trình xử lý ngoại lệ nào và ném ra ngoài hàm. Bạn không thể sửa chữa nó bằng cách sử dụng "On Error GoTo Label2"
Hãy xem xét đoạn mã này: "ERROR"
Public Sub Test()
On Error GoTo L1
MsgBox 0/(1 - 1)
Exit Sub
L1:
Err.Clear
L0:
On Error GoTo L2
MsgBox 0/(1 - 1) 'ERROR!
Exit Sub
L2:
MsgBox Err
End Sub
Nếu bạn chạy này, nó sẽ làm gián đoạn trên hàng. Nếu bạn thay thế "Err.Clear" bằng "Tiếp tục L0" thì việc thực hiện không bị gián đoạn trên "L ERI!" dòng và mã nhảy tới nhãn "L2" và cung cấp "MsgBox Err"
Nguồn
2016-05-10 13:15:17
Chúc mừng MarkJ, không thể tìm được câu trả lời này. –
Trong khi thử nghiệm tôi đã thấy rằng nếu một lỗi được nêu ra trong CleanUp một vòng lặp infinte sẽ tồn tại nảy giữa các khối ErrorHandler và CleanUp. Do đó, kỹ thuật được khuyến nghị có On Error Resume Next trong CleanUp không? –
@Rich Oliver Vâng, đó là những gì tôi làm. Xem câu hỏi này http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6 hoặc thậm chí xem qua các câu hỏi khác được gắn thẻ 'vb6' và' error-handling' http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ