VBScript - Hata işlemeyi kullanma


86

Hataları yakalamak ve günlüğe kaydetmek için VBScript kullanmak istiyorum (yani, hata durumunda "bir şey günlüğe kaydet") ve ardından komut dosyasının sonraki satırına devam etmek istiyorum.

Örneğin,

Hatada Devam Et Sonraki
Adım 1'i uygulayın
Adım 2'yi uygulayın
Adım 3'ü uygulayın

1. adımda bir hata oluştuğunda, bu hatayı günlüğe kaydetmesini (veya bununla diğer özel işlevleri gerçekleştirmesini) ve ardından 2. adımda devam etmesini istiyorum. Bu mümkün mü? ve bunu nasıl uygulayabilirim?

DÜZENLEME: Böyle bir şey yapabilir miyim?

Hata Durumunda myErrCatch'i Devam Ettir
1. adımı uygulayın
2. adımı uygulayın
3. adımı uygulayın

myErrCatch:
günlük hatası
İleri Devam Et

1
Dylan'ın cevabı, VB'nin Hata işleme departmanına geldiği kadar iyidir. Bu yüzden paçayı sıyırabildiğimde hep Javascript kullandım.
wcm

Yanıtlar:


163

VBScript istisnaları atma veya yakalama kavramına sahip değildir, ancak çalışma zamanı gerçekleştirilen son işlemin sonuçlarını içeren genel bir Err nesnesi sağlar. Her işlemden sonra Err.Number özelliğinin sıfırdan farklı olup olmadığını açıkça kontrol etmeniz gerekir.

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

"Hata Durumunda [etiket]" sözdizimi, Visual Basic ve Visual Basic for Applications (VBA) tarafından desteklenir, ancak VBScript bu dil özelliğini desteklemediğinden, yukarıda açıklandığı gibi Hata Durumunda Devam Ettirme'yi kullanmanız gerekir.


3
If deyimindeki WScript.Echo'yu, bir Function veya Sub çağırmak için değiştirebilirsiniz, bu da uygulamadan çıkıp hatayı günlüğe kaydedebilir, vb.
StormPooper

"gerçekleştirilen son işlemin yeniden kullanılmalarını içerir". Bu doğru mu? Son hatayı alıyor gibi görünüyor ki bu büyük bir fark.
Damien Golding

MS belgelerine err.clear, nesnenin her kontrolünden sonra kullanılması gerektiğini öne sürmesine rağmen , önceki hataların bir sonraki kontrolü tetiklemesini önlemek için (örn., Technet.microsoft.com/en-us/library/ee692852.aspx ) deneyimlerim errtemizlendi " kendi başına "senaryo ilerledikçe. Daha fazla test etmeden, benim tahminim, nesneleri erriç işlemlerinin bir yan ürünü olarak kullanmaktır.
user66001

@ user66001 Kabul edildi, ancak yine de açıkça aramak daha güvenli Err.Clear.
user692942

12

Bunun On Error Resume Nextgenel olarak ayarlanmadığını unutmayın . Güvenli olmayan kod parçanızı, örneğin bir hata oluştuğunda derhal kesintiye uğrayacak bir işleve koyabilir ve bu işlevi emsal OERNifadesini içeren alttan çağırabilirsiniz .

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
Şimdiye kadar gördüğüm en net örnek değil ama konsepti anlıyorum.
user692942

7
@Lankymart, o zaman gördüğünüz daha net bir örneği bağlamayı veya bunun yerine omegastripes'in bu örneği nasıl iyileştirebileceğini önerebilir misiniz?
Dominick

3
Bir saniyeliğine, "omegastripes" adlı yeni bir yazılım mühendisliği paradigmasını kaçırdığım izlenimini edindim lol
TheBlastOne

4

Bir cephe fonksiyonunda adım fonksiyonları çağrılarınızı yeniden gruplandırabilirsiniz:

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

Ardından, hata işlemenizin cepheyi çağıran bir üst işlevde olmasına izin verin:

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

Şimdi, step3()bir hata verdiğini varsayalım . Yana facade()(orada hatalarını işlemez hiçbir On error resume next içinde facade()), hata iade edilecektir main()ve step4()ve step5()idam edilmeyecektir.

Hata işlemeniz artık 1 kod bloğunda yeniden düzenlendi


1

VBScript'te son derece yeniyim, bu yüzden bu en iyi uygulama olarak kabul edilmeyebilir veya henüz farkında olmadığım bu şekilde yapılmaması gereken bir neden olabilir, ancak bu, düzeltmek için bulduğum çözüm ana kod bloğumdaki hata günlüğü kodu miktarını azaltın.

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
Bu ASP Classic, sıradan eski VBScript değil
Jobbo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.