VBScript - Sử dụng xử lý lỗi


84

Tôi muốn sử dụng VBScript để bắt lỗi và ghi lại chúng (tức là trên lỗi "ghi lại một cái gì đó") sau đó tiếp tục dòng tiếp theo của tập lệnh.

Ví dụ,

Lỗi Tiếp tục Tiếp tục Tiếp theo
'Thực hiện bước 1
'Thực hiện bước 2
'Thực hiện bước 3

Khi lỗi xảy ra ở bước 1, tôi muốn nó ghi lại lỗi đó (hoặc thực hiện các chức năng tùy chỉnh khác với nó) sau đó tiếp tục ở bước 2. Điều này có khả thi không? và làm thế nào tôi có thể thực hiện nó?

CHỈNH SỬA: Tôi có thể làm điều gì đó như thế này không?

Khi có lỗi Tiếp tục myErrCatch
'Làm bước 1
'Làm bước 2
'Làm bước 3

myErrCatch:
'lỗi nhật ký
Tiếp tục Tiếp theo

1
Phản hồi của Dylan cũng tốt như VB có trong bộ phận xử lý lỗi. Đây là lý do tại sao tôi luôn sử dụng Javascript khi tôi có thể thoát khỏi nó.
wcm

Câu trả lời:


161

VBScript không có khái niệm ném hoặc bắt các ngoại lệ, nhưng thời gian chạy cung cấp một đối tượng Err toàn cục chứa kết quả của thao tác cuối cùng được thực hiện. Bạn phải kiểm tra rõ ràng xem thuộc tính Err.Number có khác 0 không sau mỗi thao tác.

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

Cú pháp "On Error Goto [label]" được hỗ trợ bởi Visual Basic và Visual Basic for Applications (VBA), nhưng VBScript không hỗ trợ tính năng ngôn ngữ này nên bạn phải sử dụng On Error Resume Next như được mô tả ở trên.


3
Bạn có thể thay đổi WScript.Echo trong câu lệnh if để gọi một chức năng hoặc Sub, có thể lần lượt thoát khỏi ứng dụng, đăng nhập lỗi, vv
StormPooper

"chứa kết quả dừng hoạt động cuối cùng được thực hiện". Có đúng như vậy không? Có vẻ như nó nhận được lỗi cuối cùng, đó là một sự khác biệt lớn.
Damien Golding

Mặc dù tài liệu của MS gợi ý rằng err.clearcần phải được sử dụng sau mỗi lần kiểm tra đối tượng, để tránh các lỗi trước đó xảy ra trong lần kiểm tra tiếp theo (ví dụ: technet.microsoft.com/en-us/library/ee692852.aspx ), theo kinh nghiệm của tôi errlà " bởi chính nó "khi kịch bản tiến triển. Nếu không thử nghiệm thêm, tôi đoán là sử dụng các đối tượng xóa errnhư một sản phẩm phụ của các hoạt động nội bộ của chúng.
user66001

@ user66001 Đồng ý nhưng vẫn an toàn hơn khi gọi rõ ràng Err.Clear.
Lankymart

12

Lưu ý rằng On Error Resume Nextkhông được đặt trên toàn cầu. Bạn có thể đặt phần mã không an toàn của mình, ví dụ: vào một hàm, hàm này sẽ bị ngắt ngay lập tức nếu xảy ra lỗi và gọi hàm này từ OERNcâu lệnh phụ chứa tiền lệ .

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
Không phải là ví dụ rõ ràng nhất mà tôi từng thấy nhưng tôi có khái niệm.
Lankymart

7
@Lankymart, bạn có phiền liên kết một ví dụ rõ ràng hơn mà bạn đã thấy sau đó không, hay thay vào đó đề xuất cách omegastripes có thể cải thiện ví dụ này?
Dominick

3
Trong một giây, tôi có cảm giác tôi đã bỏ lỡ một mô hình công nghệ phần mềm mới có tên gọi "omegastripes" lol
TheBlastOne

4

Bạn có thể tập hợp lại các bước gọi hàm các bước của mình trong một hàm mặt tiền:

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

Sau đó, hãy để việc xử lý lỗi của bạn trong một hàm trên gọi là mặt tiền:

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

Bây giờ, giả sử step3()phát sinh lỗi. Vì facade()không xử lý lỗi ( không có On error resume next trong facade()), lỗi sẽ được trả về main()step4()step5()sẽ không được thực thi.

Xử lý lỗi của bạn hiện đã được cấu trúc lại trong 1 khối mã


1

Tôi đặc biệt mới sử dụng VBScript, vì vậy đây có thể không được coi là phương pháp hay nhất hoặc có thể có lý do không nên thực hiện theo cách này mà tôi chưa biết, nhưng đây là giải pháp tôi đã đưa ra để cắt bớt giảm số lượng mã ghi lỗi trong khối mã chính của tôi.

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
Đây là ASP Classic, không phải VBScript cũ đơn thuần
Jobbo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.