VBA - การจัดการข้อผิดพลาด

ข้อผิดพลาดในการเขียนโปรแกรมมีสามประเภท: (a) ข้อผิดพลาดทางไวยากรณ์ (b) ข้อผิดพลาดรันไทม์และ (c) ข้อผิดพลาดทางตรรกะ

ข้อผิดพลาดทางไวยากรณ์

ข้อผิดพลาดทางไวยากรณ์หรือที่เรียกว่าข้อผิดพลาดในการแยกวิเคราะห์เกิดขึ้นในเวลาตีความสำหรับ VBScript ตัวอย่างเช่นบรรทัดต่อไปนี้ทำให้เกิดข้อผิดพลาดทางไวยากรณ์เนื่องจากไม่มีวงเล็บปิด

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

ข้อผิดพลาดรันไทม์

ข้อผิดพลาดรันไทม์เรียกอีกอย่างว่าข้อยกเว้นเกิดขึ้นระหว่างการดำเนินการหลังการตีความ

ตัวอย่างเช่นบรรทัดต่อไปนี้ทำให้เกิดข้อผิดพลาดรันไทม์เนื่องจากที่นี่ไวยากรณ์ถูกต้อง แต่ในรันไทม์มันพยายามเรียก fnmultiply ซึ่งเป็นฟังก์ชันที่ไม่มีอยู่

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

ข้อผิดพลาดทางตรรกะ

ข้อผิดพลาดทางตรรกะอาจเป็นข้อผิดพลาดประเภทที่ยากที่สุดในการติดตาม ข้อผิดพลาดเหล่านี้ไม่ได้เป็นผลมาจากข้อผิดพลาดทางไวยากรณ์หรือรันไทม์ แต่จะเกิดขึ้นเมื่อคุณทำผิดพลาดในตรรกะที่ขับเคลื่อนสคริปต์ของคุณและคุณไม่ได้รับผลลัพธ์ที่คุณคาดหวัง

คุณไม่สามารถจับข้อผิดพลาดเหล่านั้นได้เนื่องจากขึ้นอยู่กับความต้องการทางธุรกิจของคุณว่าคุณต้องการใส่ตรรกะประเภทใดในโปรแกรมของคุณ

ตัวอย่างเช่นการหารตัวเลขด้วยศูนย์หรือสคริปต์ที่เขียนขึ้นซึ่งเข้าสู่การวนซ้ำแบบไม่มีที่สิ้นสุด

Err Object

สมมติว่าเรามีข้อผิดพลาดรันไทม์การดำเนินการจะหยุดลงโดยการแสดงข้อความแสดงข้อผิดพลาด ในฐานะนักพัฒนาหากเราต้องการจับข้อผิดพลาดนั้นError ใช้วัตถุ

ตัวอย่าง

ในตัวอย่างต่อไปนี้ Err.Number ให้หมายเลขข้อผิดพลาดและ Err.Description ให้คำอธิบายข้อผิดพลาด

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

การจัดการข้อผิดพลาด

VBA เปิดใช้งานรูทีนการจัดการข้อผิดพลาดและยังสามารถใช้เพื่อปิดใช้งานรูทีนการจัดการข้อผิดพลาด หากไม่มีคำสั่ง On Error ข้อผิดพลาดรันไทม์ใด ๆ ที่เกิดขึ้นจะร้ายแรง: ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นและการดำเนินการจะหยุดลงทันที

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

ซีเนียร์ คำหลักและคำอธิบาย
1

GoTo line

เปิดใช้งานรูทีนการจัดการข้อผิดพลาดที่เริ่มต้นที่บรรทัดที่ระบุในอาร์กิวเมนต์บรรทัดที่ต้องการ บรรทัดที่ระบุต้องอยู่ในโพรซีเดอร์เดียวกับคำสั่ง On Error มิฉะนั้นข้อผิดพลาดเวลาคอมไพล์จะเกิดขึ้น

2

GoTo 0

ปิดใช้งานตัวจัดการข้อผิดพลาดที่เปิดใช้งานในโพรซีเดอร์ปัจจุบันและรีเซ็ตเป็น Nothing

3

GoTo -1

ปิดใช้งานข้อยกเว้นที่เปิดใช้งานในโพรซีเดอร์ปัจจุบันและรีเซ็ตเป็น Nothing

4

Resume Next

ระบุว่าเมื่อเกิดข้อผิดพลาดรันไทม์ตัวควบคุมจะไปที่คำสั่งทันทีตามคำสั่งที่เกิดข้อผิดพลาดและการดำเนินการต่อจากจุดนั้น

ตัวอย่าง

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