VBA - Xử lý lỗi

Có ba loại lỗi trong lập trình: (a) Lỗi cú pháp, (b) Lỗi thời gian chạy và (c) Lỗi logic.

Lỗi cú pháp

Lỗi cú pháp, còn được gọi là lỗi phân tích cú pháp, xảy ra tại thời điểm diễn giải VBScript. Ví dụ: dòng sau đây gây ra lỗi cú pháp vì nó thiếu dấu ngoặc đóng.

Function ErrorHanlding_Demo()
   dim x,y
   x = "Tutorialspoint"
   y = Ucase(x
End Function

Lỗi thời gian chạy

Lỗi thời gian chạy, còn được gọi là ngoại lệ, xảy ra trong quá trình thực thi, sau khi diễn giải.

Ví dụ: dòng sau gây ra lỗi thời gian chạy vì ở đây cú pháp đúng nhưng trong thời gian chạy, nó đang cố gọi fnmultiply, đây là một hàm không tồn tại.

Function ErrorHanlding_Demo1()
   Dim x,y
   x = 10
   y = 20
   z = fnadd(x,y)
   a = fnmultiply(x,y)
End Function

Function fnadd(x,y)
   fnadd = x + y
End Function

Lỗi lôgic

Lỗi logic có thể là loại lỗi khó theo dõi nhất. Những lỗi này không phải là kết quả của lỗi cú pháp hoặc lỗi thời gian chạy. Thay vào đó, chúng xảy ra khi bạn mắc lỗi logic điều khiển tập lệnh của bạn và bạn không nhận được kết quả như mong đợi.

Bạn không thể mắc phải những lỗi đó, bởi vì nó phụ thuộc vào yêu cầu kinh doanh của bạn loại logic nào bạn muốn đưa vào chương trình của mình.

Ví dụ: chia một số cho 0 hoặc một tập lệnh được viết đi vào vòng lặp vô hạn.

Đối tượng Err

Giả sử nếu chúng ta gặp lỗi thời gian chạy, thì việc thực thi sẽ dừng lại bằng cách hiển thị thông báo lỗi. Là một nhà phát triển, nếu chúng tôi muốn ghi lại lỗi, thìError Đối tượng được sử dụng.

Thí dụ

Trong ví dụ sau, Err.Number đưa ra số lỗi và Err.Description đưa ra mô tả lỗi.

Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.

Xử lý lỗi

VBA cho phép một quy trình xử lý lỗi và cũng có thể được sử dụng để vô hiệu hóa quy trình xử lý lỗi. Nếu không có câu lệnh On Error, bất kỳ lỗi thời gian chạy nào xảy ra đều nghiêm trọng: thông báo lỗi được hiển thị và việc thực thi dừng đột ngột.

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Sr.No. Từ khoá & Mô tả
1

GoTo line

Bật quy trình xử lý lỗi bắt đầu ở dòng được chỉ định trong đối số dòng bắt buộc. Dòng được chỉ định phải có cùng quy trình với câu lệnh On Error, nếu không sẽ xảy ra lỗi thời gian biên dịch.

2

GoTo 0

Vô hiệu hóa trình xử lý lỗi đã bật trong quy trình hiện tại và đặt lại thành Không có gì.

3

GoTo -1

Tắt ngoại lệ đã bật trong quy trình hiện tại và đặt lại thành Không có gì.

4

Resume Next

Chỉ định rằng khi lỗi thời gian chạy xảy ra, điều khiển sẽ chuyển đến câu lệnh ngay sau câu lệnh xảy ra lỗi và việc thực thi tiếp tục từ thời điểm đó.

Thí dụ

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x, y, z As Integer
   x = 50
   y = 0
   z = x / y   ' Divide by ZERO Error Raises
  
   ErrorHandler:    ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 10   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
      Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
   End Select
   Resume Next
End Sub