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