2010-06-08 27 views
13

numaralı hatada Özgeçmiş ile Goto arasındaki fark Aşağıdaki örnekte bir Goto ifadesi yerine bir Özgeçmiş ifadesinin kullanılmasının gerektiğini anlıyorum.Hata işleme bloğu

Sub Method() 
    On Error Goto ErrorHandler 
    ... 
CleanUp: 
    ... 
    Exit Function 

ErrorHandler: 
    Log error etc 

    Err.Clear 'Is this line actually necessary?' 

    Resume CleanUp 'SHOULD USE THIS' 
    Goto CleanUp 'SHOULD NOT USE THIS' 
End Sub 

Benim sorum, bu ikisinin uygulanmasında ne gibi bir fark var?

cevap

21

Her iki aktarım işlemi de Cleanup etiketine aktarılır. Bildiğim kadarıyla Hatırladığım kadarıyla, sadece farklılıklar Err nesnesi silmiyor Goto kullanma

  • ve videonun hata işleyicisi devre dışı bırakır (eğer Goto kullanmak eğer öyleyse Err.Clear gereklidir). Cleanup etiketinden sonra bir hata oluşursa, ErrorHandler adresinde ele alınmaz.
  • Resume öğesinin kullanılması Err nesnesini temizler ve hata işleyicinizi tekrar açar (hata işlenirken devre dışı bırakılır). Bir hata Cleanup etikel sonra meydana gelirse, farklılıkları açıklamıyor ErroHandler

VB6 manual entry for the Resume statement ele alınacaktır.

+0

Cheers MarkJ'i sağlar, bu cevaptan çok şey öğrenmez. –

+1

Test ederken, CleanUp'ta bir hata ortaya çıkarsa, ErrorHandler ve CleanUp blokları arasında sıçrama yapmanın bir infinte döngüsünün mevcut olacağını buldum. Önerilen teknik, CleanUp'ta Hata Giderme Devam Ediyor mu? –

+0

@Rich Oliver Evet, yaptığım işte bu. Http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6 bu soruyu kontrol edin ve hatta 'vb6' ve' etiketli diğer sorulara bakın. hata işleme 'http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ

2

Bu büyük bir yanlış anlama! arasında önemli bir fark vardır:

Err.Clear 
GoTo CleanUp 

ve:

Resume CleanUp 

her zaman Devam Temizleme aracını kullanarak, ilk şeklini kullanmamayı (sadece). Dahili VB6 hata durumunun SIFIRLANMASINI devam ettirin, bu nedenle DİĞER bir hata oluştuğunda, "Hata Bildirimi Üzerine Etiket" uygulanacaktır. Ben "Err.Clear" kullanırsınız, sonra Err nesnesi temizlenir, ancak DAHİLİ hata durumu silinmez ve başka bir hata oluştuğunda, herhangi bir istisna eylemcisi OLMADAN kod olarak kabul edilir ve işlev dışında atar. Sen

bu kodu düşünün "Hata GoTo Label2 Üzerine" kullanarak bunu düzeltmek CAN NOT: "ERROR" Bu çalıştırırsanız

Public Sub Test() 
On Error GoTo L1 
MsgBox 0/(1 - 1) 
Exit Sub 

L1: 
    Err.Clear 
L0: 
    On Error GoTo L2 
    MsgBox 0/(1 - 1) 'ERROR! 
    Exit Sub 

L2: 
    MsgBox Err 
End Sub 

, bu üzerinde kesintiye uğratır hat. "Err.Clear" ı "Resume L0" ile değiştirirseniz, yürütme işlemi "ERROR!" Ile kesilmez. satır ve kod "L2" etiketine atlar ve "MsgBox Err"