Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Function bẩy lỗi
#1
Chào anh chị, để hiển thị lỗi khi sử dụng chương trình mình hay sử dụng 
On error go to err

Exit:
 Exit sub
Err:
     errnumber errdescripton
    resume exit


Nhưng mỗi event đều phải khai báo lập đi lập lại cú pháp như vậy.

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.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#2
Đâ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  007 )
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  040 . 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 tranthanhan1962 Kế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  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#3
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ù. 005 005
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#4
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 tranthanhan1962 Kế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  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#5
(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ù. 005 005

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.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn tranthanhan1962


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] Function keydown và keypress mrsiro 0 57 17-05-18, 10:26 AM
Bài mới nhất: mrsiro
  [Hỏi] Khai báo function mrsiro 7 255 21-04-18, 04:27 PM
Bài mới nhất: ongke0711
  Hỏi về Function và Property Get Che_Guevara 2 785 14-10-16, 03:46 PM
Bài mới nhất: Che_Guevara
  [Hỏi] Gỡ rối về Dlookup function tvn_hut 10 2,450 25-08-13, 11:30 PM
Bài mới nhất: tvn_hut
  Lỗi sub or function not đefine dungnvl08 3 2,558 17-04-11, 06:45 PM
Bài mới nhất: dungnvl08

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line