Xử lý lỗi

vbano1

SMod
Thành viên BQT
Xử lý lỗi:
Chúng ta sẽ xử lý lỗi bằng câu lệnh On Error.

Điểm chính trong bài viết này:
  • Câu lệnh On Error
  • Câu lệnh Resume
  • Err Object
Code mẫu:
Chúng ta sẽ cùng tìm hiểu về vai trò của On Error và Resume trong đoạn code dưới đây.
Mã:
Sub Error_Sample()
    Dim i As Long 'Mặc định: Giá trị khởi tạo của i = 0
    Dim dblAns As Double
    On Error Resume Next 'Phớt lờ lỗi phát sinh nếu có, cứ tiến hành các công việc tiếp theo
        dblAns = 100 / i    'Câu lệnh này sẽ tạo ra lỗi nếu i = 0
    On Error GoTo 0 'Hủy bỏ trạng thái phớt lờ lỗi, từ giờ nếu có lỗi xảy ra thì người dùng sẽ được biết
    MsgBox dblAns ' 1.#INF(Phép chia sẽ không thực hiện được khi chia cho 「0」, kết quả sẽ sai)
    On Error GoTo ERROR 'Lỗi nếu phát sinh thì chạy tới nhãn ERROR
        dblAns = 100 / i
    On Error GoTo 0
    MsgBox dblAns ' 5
    Exit Sub
ERROR:
    i = 20
    Resume 'Quay trở lại nơi xảy ra lỗi
End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Chú ý:
Câu lệnh On Error:

Tiến hành xử lý khi có lỗi xảy ra, tại vị trí xảy ra lỗi bên trong chương trình thì câu lệnh này sẽ được kích hoạt thực thi.
Chúng ta cũng có thể chỉ định phớt lờ lỗi hoàn toàn.
Hoặc nếu gặp lỗi thì không làm việc nữa bằng cách sử dụng Exit Sub.


Cấu trúc 1:On Error GoTo line
Tham số [line] là tên nhãn do chúng ta chỉ định. Khi xảy ra lỗi, các dòng code tiếp theo sẽ bị phớt lờ, chương trình sẽ nhảy thẳng tới vị trí có nhãn để thực thi các lệnh trong nhãn này. Tên nhãn các bạn có thể đặt tùy ý, thông thường sẽ được viết hoa để cho dễ hình dung. Ví dụ: ERR1, ERR2,...


Cấu trúc 2:On Error Resume Next
Câu lệnh này tuyên bố rằng nếu có lỗi thì chương trình vẫn sẽ được thực thi các dòng code tiếp theo. Có nghĩa là nó phớt lờ toàn bộ lỗi.
Dù cho phớt lờ lỗi, thì lỗi nếu có vẫn được lưu thông tin trong biến Err Object. Bằng cách sử dụng biến đối tượng Err, người lập trình hoàn toàn có thể đoán biết được nguyên nhân xảy ra lỗi nếu muốn.


Cấu trúc 3:On Error GoTo 0
Từ giờ trở đi, nếu có lỗi xảy ra thì sẽ tiến hành xử lý lỗi bình thường, hủy bỏ chế độ phớt lờ lỗi nếu đã được thiết định trước đó.


Câu lệnh Resume:
Sau khi xử lý lỗi kết thúc, chương trình sẽ được tái khiển trai, thực thi tiếp các câu lệnh sau đó.


Cấu trúc 1:Resume [0]
Có thể giản lược không cần viết [0].
Sau khi lỗi xảy ra, chương trình sẽ quay về nơi bắt đầu nguyên nhân xảy ra lỗi. Các bạn thử chạy đoạn code trên, các bạn sẽ hiểu tại sao lại có thông báo 5.
Bạn cần đăng nhập để thấy đính kèm


Cấu trúc 2:Resume Next
Sau khi lỗi xảy ra, từ nơi xảy ra nguyên nhân lỗi, nó sẽ tiếp tục thực thi các dòng code tiếp theo.

Cấu trúc 2:Resume line
Chương trình sẽ nhảy tới nơi có nhãn [line] để thực thi các câu lệnh của nhãn này.

Tiếp theo chúng ta sẽ tìm hiểu về sự khác nhau giữa ResumeResume Next.
Code_2A:
Sub Error_Test_1()
    Dim i As Long
    Dim dblAns As Double
    On Error GoTo ERROR
    dblAns = 100 / i
    MsgBox dblAns ' 5
    Exit Sub
ERROR:
    i = 20
    Resume
End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


Code_2B:
Sub Error_Test_2()
    Dim i As Long
    Dim dblAns As Double
    On Error GoTo ERROR
    dblAns = 100 / i
    MsgBox dblAns  ' 1.#INF(Lỗi xảy ra khi i = 0)
    Exit Sub
ERROR:
    i = 20
    Resume Next
End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


(Còn nữa)
Nguồn tham khảo:
 

giaiphapvba

Administrator
Thành viên BQT
Err Object:
Err
Object là đối tượng lưu trữ thông tin liên quan tới lỗi xảy ra trong quá trình thực thi macro.

●Khi macro thực thi mà phát sinh lỗi, để phân biệt giữa các lỗi với nhau, thông tin về lỗi được cất trong biến đối tượng Err. Chúng ta có thể sử dụng thông tin này theo ý đồ xử lý code của chúng ta.
●Các thuộc tính của biến đối tượng Err sẽ bị reset sau khi các lệnh sau được thực thi Exit Sub, Exit Function, Exit Property, Resume Next , giá trị reset là 0 hoặc có độ dài là 0 nếu nó là chuỗi ký tự, tức là "".
●Cố tình tạo lỗi phát sinh trong quá trình thực thi macro hãy sử dụng phương thức Raise.

【Các điểm chính】
・Thuộc tính Number: Khi lỗi phát sinh thì số hiệu lỗi sẽ được thiết định. Số hiệu lỗi để phân biệt các lỗi với nhau, nó giống như biển số xe để phân biệt giữa các xe với nhau.
・Thuộc tính Source: Đối tượng khởi phát lỗi hoặc tên của Application sẽ được thiết định tên.
・Thuộc tính Description: Khi lỗi phát sinh, văn bản thuyết minh về lỗi sẽ được thiết định.
・Phương thức Clear: Giá trị của tất cả các thuộc tính của Err sẽ được xóa sạch.
・Phương thức Raise: Tạo lỗi trong quá trình thực thi. Hãy xem ví dụ dưới đây.
Mã:
Sub Raise_Error()
    Dim strMsg As String
    On Error Resume Next ' Neu loi xay ra thi cu the thuc thi, phot lo loi.
    With Err
        .Clear
        .Raise 6 ' "Tao loi OverFlow
        If .Number <> 0 Then
            strMsg = "So hieu loi: " & Str(.Number) & vbCrLf & .Source & _
                  " da phat sinh." & vbCrLf & .Description
            MsgBox strMsg, , "Loi", .HelpFile, .HelpContext
        End If
    End With
End Sub
Bạn cần đăng nhập để thấy đính kèm


(Hết)
Nguồn:
 
Top