Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Có cách nào khai báo 1 function error, lúc này tại các event cần thiết chỉ cần call function error đó lên để dùng không cần phải viết từng dòng ở từng event.

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bài viết: 2,371 Chủ đề: 85 Tham Gia: 30-10 -14 Điểm danh tiếng: 121

Số lần cảm ơn 696 2940 cảm ơn trong 1570 bài

Tiền Access: 63,358.28Ac$

04-05-18, 01:36 PM (Được chỉnh sửa: 04-05-18, 01:47 PM bởi tranthanhan1962.)

Đây là cú pháp xử lý lỗi bất kỳ trong code và có thể được đặt trong bất kỳ sub hoặc function nào. Cú pháp đầy đủ:

Mã:

Function ABC() /Sub BDE() ' Bật hệ thống xử lý lỗi. On Error GoTo Bị_lỗi /Hoặc ErrorOPQ/ErrorXYZ Lệnh 1 Lệnh 2 Lệnh 3 ....... Lệnh n Exit_Bị_lỗi /Hoặc ErrorOPQ/ErrorXYZ: Exit Function/Sub Error_Bị_lỗi /Hoặc ErrorOPQ/ErrorXYZ: Lệnh 1 Lệnh 2 Lệnh 3 ....... Lệnh n End Function

Trường hợp ngắn gọn:

Mã:

Function ABC() /Sub BDE() ' Bật hệ thống xử lý lỗi. On Error GoTo Bị_lỗi Lệnh 1 Lệnh 2 Lệnh 3 ....... Lệnh n Bị_lỗi: Lệnh 1 Lệnh 2 Lệnh 3 ....... Lệnh n End Function

Có nghĩa là tham số Bị_lỗi cho phép mã chương trình khi chạy đếu đâu bị bất kỳ lỗi gì nó chũng đều phát hiện và bị dừng xử lý đế mã lệnh kế tiếp và truyền thẳng đến Bị_lỗi: để thực hiện các lệnh của Bị_lỗi: . Thực ra người ta xử dụng bẩy lỗi bất kỳ này trong trường hợp dự phòng khi phòng hờ có lỗi xảy ra mà code thủ chưa biết hoặc không biết lỗi gì (phòng ngừa hoặc dốt

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024
) Giả sử trên form bạn có 3 texbox A, B, C. Khi bạn nhập số vào cho A và B thì C sẽ có giá trị = A/B. Lúc này bạn sẽ viết các event cho B như sau:

Mã:

Private Sub B_AfterUpdate() C.Value = A.Value / B.Value End Sub

Nhưng lúc này sẽ xảy ra trường hợp lỗi. 1/Nếu A chứa text sẽ bị lỗi 2/Nếu B=0 sẽ bị lỗi 3/Xảy ra trường hợp nào đó bị lỗi mà mình chưa nghĩ ra. Nếu bạn xác định tất cả các trường hợp lỗi bạn có thể dùng if hoặc Select Case để xử lý. Nhưng ở đây nếu xảy ra một trường hợp lỗi nào khác thì sao? Suy nghĩ cho bằng được tất cả các trường hợp rồi viết tiếp

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024
. Không cần chỉ cần phang đoạn code này vào là xong:

Mã:

Private Sub B_AfterUpdate() On Error GoTo Bị_lỗi C.Value = A.Value / B.Value Bị_lỗi: MsgBox "Đã bị lỗi" Exit Sub End Sub

Vì vậy! Đây là một bẩy lỗi bất kỳ. Và tất nhiên khi bạn muốn đưa nó vào bất kỳ event, sub, function nào thì bạn cứ đưa vào. Mẫu của Microsoft đầy đủ thì có vẻ dài dòng nhưng khi sử dụng thực tế thì cực kỳ đơn giản

On Error GoTo Bị_lỗi ...... Bị_lỗi: ......

Chữ ký của tranthanhan1962Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bài viết: 271 Chủ đề: 44 Tham Gia: 05-12 -14 Điểm danh tiếng: 0

Số lần cảm ơn 94 55 cảm ơn trong 45 bài

Tiền Access: 6,636.87Ac$

Nếu mà có function thì code nhìn đẹp hơn, chứ 1 form mà cứ chèn on error các thứ nhìn nó rối bù.

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024
Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bài viết: 2,371 Chủ đề: 85 Tham Gia: 30-10 -14 Điểm danh tiếng: 121

Số lần cảm ơn 696 2940 cảm ơn trong 1570 bài

Tiền Access: 63,358.28Ac$

Chỉ cần 2 dòng code là xử lý xong. Quan trong là chạy tốt cứ khi viết code xong có ai nhìn

Chữ ký của tranthanhan1962Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Bài viết: 3,533 Chủ đề: 59 Tham Gia: 10-04 -15 Điểm danh tiếng: 163

Số lần cảm ơn 573 3993 cảm ơn trong 2374 bài

Tiền Access: 91,160.96Ac$

05-05-18, 01:09 AM (Được chỉnh sửa: 05-05-18, 01:11 AM bởi ongke0711.)

(04-05-18, 05:42 PM)mrsiro Đã viết: Nếu mà có function thì code nhìn đẹp hơn, chứ 1 form mà cứ chèn on error các thứ nhìn nó rối bù.
Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024
Bẫy lỗi quá trình bẫy lỗi và phòng ngừa năm 2024

Cú pháp bẫy lỗi chi tiết của VBA Access chỉ có 1 format là: (bỏ qua các bẫy lỗi "On Error Resume Next", "On Error Goto 0", "On Error Goto 1")

On Error Goto [label] -> [Label]: có thể là "ErrHandler", "BayLoi", "EH" hay gì đó... tùy bạn đặt tên.

Bạn không thể đưa Function vô vị trí [Label] để cho gọn đc vì sai cú pháp. Nếu muốn thiết kế function thì chỉ có thiết kế cho phần [Label] này thôi và nó cũng không đẹp hơn bao nhiêu, có thể gọn hơn chút nhưng đổi lại sẽ mất đi sự bẫy lỗi đặc thù cho từng event. Giống như code demo của anh tranthanhan1962, dùng Select Case để bẫy từng trường hợp mà nhưng case này khác nhau tùy theo từng nút lệnh, từng event.

Ví dụ: Select Case Err.Number Case 3021 —> Không có record. Dùng khi di chuyển record. Case 3022 —> Trùng mã PK. Dùng khi thêm mới record. Case 3044 —> Sai đường dẫn. Dùng chi chọn file. End Select Ứng với mỗi Case sẽ có code xử lý khác nhau tùy theo cái form, cái event đang chạy. Nếu chỉ thuần túy dùng Function chung chung để báo lỗi thì chẳng giúp ích người sử dụng là mấy khi gặp nhưng lỗi này.