VBScript - ใช้การจัดการข้อผิดพลาด


86

ฉันต้องการใช้ VBScript เพื่อตรวจจับข้อผิดพลาดและบันทึก (กล่าวคือเมื่อเกิดข้อผิดพลาด "log something") จากนั้นเริ่มบรรทัดถัดไปของสคริปต์

ตัวอย่างเช่น,

ใน Error Resume Next
'ทำขั้นตอนที่ 1
'ทำขั้นตอนที่ 2
'ทำขั้นตอนที่ 3

เมื่อเกิดข้อผิดพลาดในขั้นตอนที่ 1 ฉันต้องการให้บันทึกข้อผิดพลาดนั้น (หรือใช้ฟังก์ชันที่กำหนดเองอื่น ๆ ) จากนั้นดำเนินการต่อในขั้นตอนที่ 2 เป็นไปได้หรือไม่ และฉันจะนำไปใช้ได้อย่างไร

แก้ไข: ฉันสามารถทำสิ่งนี้ได้หรือไม่?

บน Error Resume myErrCatch
'ทำขั้นตอนที่ 1
'ทำขั้นตอนที่ 2
'ทำขั้นตอนที่ 3

myErrCatch:
'บันทึกข้อผิดพลาด
ดำเนินการต่อ

1
การตอบสนองของ Dylan นั้นดีพอ ๆ กับที่ VB ได้รับในแผนกจัดการข้อผิดพลาด นี่คือเหตุผลที่ฉันใช้ Javascript เสมอเมื่อฉันสามารถใช้งานได้
wcm

คำตอบ:


163

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

On Error Resume Next

DoStep1

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStep1: " & Err.Description
  Err.Clear
End If

DoStep2

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStop2:" & Err.Description
  Err.Clear
End If

'If you no longer want to continue following an error after that block's completed,
'call this.
On Error Goto 0

ไวยากรณ์ "On Error Goto [label]" ได้รับการสนับสนุนโดย Visual Basic และ Visual Basic for Applications (VBA) แต่ VBScript ไม่สนับสนุนคุณลักษณะภาษานี้ดังนั้นคุณต้องใช้ On Error Resume Next ตามที่อธิบายไว้ข้างต้น


3
คุณสามารถเปลี่ยน WScript.Echo ภายในคำสั่ง If เพื่อเรียกใช้ฟังก์ชันหรือ Sub ซึ่งจะสามารถออกจากแอปพลิเคชันบันทึกข้อผิดพลาด ฯลฯ
StormPooper

"มี reuslts ของการดำเนินการล่าสุดที่ดำเนินการ" เป็นเช่นนั้นจริงหรือ? ดูเหมือนว่าจะได้รับข้อผิดพลาดล่าสุดซึ่งเป็นข้อแตกต่างใหญ่
Damien Golding

แม้ว่าเอกสารของ MS จะแนะนำว่าerr.clearต้องใช้หลังจากการตรวจสอบวัตถุแต่ละครั้งเพื่อป้องกันข้อผิดพลาดก่อนหน้านี้ในการตรวจสอบครั้งต่อไป (เช่นtechnet.microsoft.com/en-us/library/ee692852.aspx ) จากประสบการณ์ของฉันerrก็ถูกล้าง " ด้วยตัวมันเอง "ในขณะที่บทดำเนินไป โดยไม่ต้องทดสอบเพิ่มเติมการคาดเดาของฉันคือการใช้อ็อบเจ็กต์เคลียร์errเป็นผลจากการดำเนินการภายใน
user66001

@ user66001 ที่ตกลงกัน Err.Clearแต่ยังคงปลอดภัยมากขึ้นอย่างชัดเจนโทร
user692942

12

โปรดทราบOn Error Resume Nextว่าไม่ได้ตั้งค่าทั่วโลก คุณสามารถใส่ส่วนที่ไม่ปลอดภัยของโค้ดเช่นลงในฟังก์ชันซึ่งจะหยุดชะงักทันทีหากเกิดข้อผิดพลาดและเรียกใช้ฟังก์ชันนี้จากส่วนย่อยที่มีOERNคำสั่งก่อนหน้า

ErrCatch()

Sub ErrCatch()
    Dim Res, CurrentStep

    On Error Resume Next

    Res = UnSafeCode(20, CurrentStep)
    MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description

End Sub

Function UnSafeCode(Arg, ErrStep)

    ErrStep = 1
    UnSafeCode = 1 / (Arg - 10)

    ErrStep = 2
    UnSafeCode = 1 / (Arg - 20)

    ErrStep = 3
    UnSafeCode = 1 / (Arg - 30)

    ErrStep = 0
End Function

1
ไม่ใช่ตัวอย่างที่ชัดเจนที่สุดที่ฉันเคยเห็น แต่ฉันได้แนวคิด
user692942

7
@Lankymart คุณช่วยเชื่อมโยงตัวอย่างที่ชัดเจนกว่าที่คุณเคยเห็นมาก่อนหรือแนะนำว่า omegastripes สามารถปรับปรุงตัวอย่างนี้ได้อย่างไร
Dominick

3
วินาทีหนึ่งฉันรู้สึกประทับใจที่พลาดกระบวนทัศน์ใหม่ทางวิศวกรรมซอฟต์แวร์ที่เรียกว่า "omegastripes" lol
TheBlastOne

4

คุณสามารถจัดกลุ่มฟังก์ชันขั้นตอนของคุณใหม่ได้ในฟังก์ชันซุ้ม:

sub facade()
    call step1()
    call step2()
    call step3()
    call step4()
    call step5()
end sub

จากนั้นปล่อยให้การจัดการข้อผิดพลาดของคุณอยู่ในฟังก์ชั่นด้านบนที่เรียกส่วนหน้า:

sub main()
    On error resume next

    call facade()

    If Err.Number <> 0 Then
        ' MsgBox or whatever. You may want to display or log your error there
        msgbox Err.Description
        Err.Clear
    End If

    On Error Goto 0
end sub

ทีนี้สมมติว่าstep3()เกิดข้อผิดพลาด เนื่องจากfacade()ไม่จัดการข้อผิดพลาด ( ไม่มี On error resume nextในfacade()) ข้อผิดพลาดจะถูกส่งกลับไปที่main()และstep4()และstep5()จะไม่ดำเนินการ

ขณะนี้การจัดการข้อผิดพลาดของคุณได้รับการปรับโครงสร้างใหม่ใน 1 บล็อกรหัส


1

ฉันยังใหม่กับ VBScript เป็นพิเศษดังนั้นนี่อาจไม่ถือเป็นแนวทางปฏิบัติที่ดีที่สุดหรืออาจมีเหตุผลที่ไม่ควรทำในแบบที่ฉันยังไม่รู้ แต่นี่เป็นวิธีแก้ปัญหาที่ฉันคิดขึ้นเพื่อตัดแต่ง ลดจำนวนรหัสบันทึกข้อผิดพลาดในบล็อกรหัสหลักของฉัน

Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"

ON ERROR RESUME NEXT

oConn.Open connStr
If err.Number <> 0 Then : showError() : End If


Sub ShowError()

    'You could write the error details to the console...
    errDetail = "<script>" & _
    "console.log('Description: " & err.Description & "');" & _
    "console.log('Error number: " & err.Number & "');" & _
    "console.log('Error source: " & err.Source & "');" & _
    "</script>"

    Response.Write(errDetail)       

    '...you could display the error info directly in the page...
    Response.Write("Error Description: " & err.Description)
    Response.Write("Error Source: " & err.Source)
    Response.Write("Error Number: " & err.Number)

    '...or you could execute additional code when an error is thrown...
    'Insert error handling code here

    err.clear
End Sub

1
นี่คือ ASP Classic ไม่ใช่ VBScript แบบเก่า
Jobbo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.