Bẫy lỗi trong code

phatnq2002

Tích cực giảm cân...
Hội viên mới
Trong quá trình thao tác nhập liệu trên form, hoặc khi thực hiện một thủ tục nào đó trong code, có thể sẽ phát sinh ra lỗi. Khi một lỗi xảy ra, hệ thống (Access) sẽ thông báo và khi đó tiến trình sẽ bị ngắt, các giá trị đã gán trước đó sẽ bị hủy và như vậy nếu cho thực thi tiếp lại xảy ra những lỗi khác.

Lỗi được tạm chia làm hai dạng:
- Dạng xảy ra khi có một sự cố về việc cập nhật dữ liệu: thường là lỗi Primary key bị trùng hoặc để trống, lỗi field được xác lập thuộc tính Required là Yes nhưng không nhập gì cả, …
- Dạng xảy ra do một câu lệnh khi thực thi đã sản sinh ra một lỗi: ví dụ câu lệnh a = b/c, trong đó c = 0, …

Để có thể tiếp tục thực hiện tiếp những công việc sau đó mà ứng dụng không bị ngắt, chúng ta phải thực hiện một công việc được gọi là bẫy lỗi (trap errors).

Trường hợp 1:
Để bẫy lỗi do hệ thống trả về, chúng ta có thể điều khiển sự kiện OnError của Form. Sự kiện này xảy ra khi có bất kỳ một lỗi nào được sản sinh trong quá trình nhập liệu trên form, nó được “lẩy” khi record hiện thời chuẩn bị được lưu vào table. Chúng ta có thể code cho thủ tục sự kiện Form_Error để bẫy những lỗi này.

Ví dụ sau đây dùng để bẫy một số lỗi cơ bản:

Private Sub Form_Error (DataErr As Integer, Response As Integer)
Response = acDataErrContinue ‘ tắt thông báo của Access
Select Case DataErr
Case 3022
MsgBox “Trùng khóa chính.”
Case 3058
MsgBox “Khóa chính để trống.”
Case 3314
MsgBox “Có ít nhất một field chưa nhập theo yêu cầu bắt buộc.”
Case Else
MsgBox “Có lỗi xảy ra.” & Chr(13) & “Chỉ số lỗi: “ & DataErr & Chr(13) & _
“Nội dung lỗi: “ & Err.Description
End Select
End Sub


Trường hợp 2:
Để bẫy lỗi trong code, chúng ta sẽ sử dụng cấu trúc sau:

Cấu trúc 1: Bỏ qua câu lệnh sản sinh ra lỗi, tiếp tục thực hiện lệnh kế sau.
Cấu trúc này thường dùng khi những lỗi xảy ra không phải là lỗi nghiêm trọng, không ảnh hưởng đến dữ liệu và các xử lý tiếp theo.

On Error Resume Next
Lệnh 1
Lệnh 2

On Error Goto 0


Ví dụ: Khi nhấn vào nút In, sẽ cho thi hành lệnh mở report rptIN ở chế độ Preview.

Private Sub cmdIn_Click ()
DoCdm.OpenReport “rptIN”, acViewPreview
End Sub


Sẽ không có gì xảy ra khi người sử dụng nhấn nút. Nhưng nếu trong rptIN, có đặt một đoạn code sau cho sự kiện OnNoData để hiển thị thông báo “Không có dữ liệu để in.”, đồng thời không cho mở report.

Private Sub Report_NoData (Cancel As Integer)
MsgBox “Không có dữ liệu để in.”
Cancel = True
End Sub


Câu lệnh DoCdm.OpenReport “rptIN”, acViewPreview trong thủ tục cmdIn_Click sẽ gây ra một lỗi ngay. Tuy nhiên lỗi này không phải là lỗi nghiêm trọng gì, chẳng qua là không có gì để in thôi.

Do đó chúng ta sẽ thiết kế lại thủ tục cmdIn_Click như sau:

Private Sub cmdIn_Click ()
On Error Resume Next
DoCdm.OpenReport “rptIN”, acViewPreview
On Error Goto 0
End Sub


Cấu trúc 2: Chuyển hướng xử lý.
Cấu trúc này thường dùng khi có lỗi nghiêm trọng ảnh hưởng đến việc nhập liệu và xử lý.

Sub [Function] rouName (………) [As ….]
Lệnh k
Lệnh k + 1

On Error Goto Nhãn_2
Lệnh 1
Lệnh 2

[Nhãn_3:)
Lệnh n – 2
Lệnh n – 1
Lệnh n
Nhãn_1:
Exit Sub ‘hoặc Exit Function tùy theo đây là thủ tục hay hàm
Nhãn_2:
‘ Kiểm tra xem lỗi gì xảy ra bằng Err.Number và Err.Description, sau đó thông báo
‘ cho người dùng biết.
‘ Đến đây, có thể cho chuyển hướng xử lý bắng một trong hai cách:
‘ Resume Nhãn_3: nếu muốn trước khi ngưng thủ tục hoặc hàm, phải thực hiện tiếp một số lệnh
‘Resume Nhãn_1: ngưng ngay thủ tục hoặc hàm
End Sub [hoặc Function]


Ví dụ: Trong một thủ tục, có yêu cầu thi hành một lệnh SQL để insert dữ liệu vào một từ table từ dữ liệu của table khác. Để tránh trường hợp nơi nhận có nhiều field hơn hoặc nơi nhận có ít field hơn hoặc tên field không tồn tại, chúng ta sẽ bẫy lỗi để phòng.

Private Sub Test ()
On Error Goto loi
CurrentDB.Execute “INSERT INTO tblA (fieldA, fieldB) SELECT fieldA, fieldB, fieldC FROM tblB” ‘Câu lệnh insert có số filed ở SELECT nhiều hơn số field nhận
DoCmd.OpenReport “rptInDuLieuTableA”
thoat:
Exit Sub
loi:
MsgBox “Có lỗi xảy ra khi có ý định chèn dữ liệu vào table A. Vui lòng liên hệ lập trình viên.”
Resume thoat
End Sub



Trên đây là một vài cách để bẫy lỗi thông dụng. Không biết nội dung có thích hợp với mọi người không? :D
 
Vì diễn đàn danketoan cho phép dùng thẻ Code nên bạn hãy cho những dòng code trong thẻ
Mã:
 để hiển thị code cho đẹp

Ví dụ:
[CODE]
Private Sub Form_Load()
'******************************************************************************
'*                                                                            *
'* Name:    Form_Load                                                         *
'*                                                                            *
'* Purpose: Load Form                                                         *
'*                                                                            *
'******************************************************************************

On Error GoTo Form_Load_Error




Form_Load_Done:
  Exit Sub

Form_Load_Error:
  Call Process_Error(MODULE_NAME, "Form_Load")
  Resume Form_Load_Done
End Sub
 
Khi bạn sử dụng VBA và cho thi hành một ứng dụng nào đó, bạn sẽ thấy một thông báo lỗi nhưng bạn không biết lỗi đó là lỗi gì. Bạn chỉ cần thêm dòng lệnh sau :

Mã:
msgbox Err.Description & vbCrLf & Err.number


Hộp thoại sẽ hiển thị và cho bạn biết lỗi xảy ra và số của lỗi đó.
:p
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top