On Error Deyimi (Visual Basic)

Hata işleme yordamını etkinleştirir ve yordam içindeki yordamın konumunu belirtir; hata işleme yordamını devre dışı bırakmak için de kullanılabilir. deyimi On Error yapılandırılmamış hata işlemede kullanılır ve yapılandırılmış özel durum işleme yerine kullanılabilir. Yapılandırılmış özel durum işleme .NET'te yerleşiktir, genellikle daha verimlidir ve uygulamanızdaki çalışma zamanı hatalarını işlerken de önerilir.

Hata işleme veya özel durum işleme olmadan, oluşan herhangi bir çalışma zamanı hatası önemli olur: bir hata iletisi görüntülenir ve yürütme durur.

Not

Anahtar Error sözcüğü, geriye dönük uyumluluk için desteklenen Error Deyimi'nde de kullanılır.

Sözdizimi

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Parça

Süre Tanım
GoToSatır Gerekli satır bağımsız değişkeninde belirtilen satırda başlayan hata işleme yordamını etkinleştirir. Satır bağımsız değişkeni herhangi bir satır etiketi veya satır numarasıdır. Bir çalışma zamanı hatası oluşursa, dalları belirtilen satıra denetle ve hata işleyicisini etkin hale getir. Belirtilen satır, deyimiyle aynı yordamda On Error olmalıdır, aksi takdirde derleme zamanı hatası oluşur.
GoTo 0 Geçerli yordamda etkin hata işleyicisini devre dışı bırakır ve olarak Nothingsıfırlar.
GoTo -1 Geçerli yordamda etkin özel durumu devre dışı bırakır ve olarak Nothingsıfırlar.
Resume Next Bir çalışma zamanı hatası oluştuğunda, denetimin hatanın oluştuğu deyimin hemen ardından deyimine gittiğini ve yürütmenin bu noktadan itibaren devam ettiğini belirtir. Nesnelere erişirken kullanmak yerine On Error GoTo bu formu kullanın.

Açıklamalar

Not

Yapılandırılmamış özel durum işlemeyi ve deyimini kullanmak yerine mümkün olduğunda kodunuzda yapılandırılmış özel durum işlemeyi On Error kullanmanızı öneririz. Daha fazla bilgi için bkz . Try... Yakalamak... Finally Deyimi.

"Etkin" hata işleyicisi, bir deyimi tarafından açık olan bir On Error hata işleyicidir. "Etkin" hata işleyicisi, bir hatayı işleme sürecinde olan etkin bir işleyicidir.

Hata işleyici etkinken bir hata oluşursa (hatanın oluşumu ile Resume, Exit Sub, Exit Functionveya Exit Property deyimi arasında), geçerli yordamın hata işleyicisi hatayı işleyemiyor. Denetim, çağırma yordamına döner.

Çağırma yordamının etkin bir hata işleyicisi varsa, hatayı işlemek için etkinleştirilir. Çağıran yordamın hata işleyicisi de etkinse, denetim etkin olmayan ancak etkin olmayan bir hata işleyicisi bulunana kadar önceki çağrı yordamlarından geçer. Böyle bir hata işleyicisi bulunamazsa, hata oluştuğu noktada önemli olur.

Hata işleyicisi denetimi bir çağırma yordamına her geçtiğinde, bu yordam geçerli yordam olur. Bir hata herhangi bir yordamdaki bir hata işleyicisi tarafından işlendikten sonra yürütme, deyimi tarafından belirlenen noktada geçerli yordamda Resume devam eder.

Not

Hata işleme yordamı bir Sub yordam veya Function yordam değildir. Bir satır etiketi veya satır numarasıyla işaretlenmiş bir kod bölümüdür.

Sayı Özelliği

Hata işleme yordamları, hatanın nedenini belirlemek için nesnenin Err özelliğindeki değere Number dayanır. Başka bir hata oluşmadan veya hataya Err neden olabilecek bir yordam çağrılmadan önce yordamın nesnedeki ilgili özellik değerlerini test etmesi veya kaydetmesi gerekir. Nesnedeki Err özellik değerleri yalnızca en son hatayı yansıtır. ile Err.Number ilişkilendirilmiş hata iletisi içinde Err.Descriptionyer alır.

Throw Deyimi

yöntemiyle Err.Raise oluşturulan bir hata özelliği sınıfın Exception yeni oluşturulan bir örneğine Exception ayarlar. Türetilmiş özel durum türlerinin özel durumlarının oluşturulmasını desteklemek için dilde bir Throw deyim desteklenir. Bu, oluşturulacak özel durum örneği olan tek bir parametre alır. Aşağıdaki örnek, bu özelliklerin mevcut özel durum işleme desteğiyle nasıl kullanılabileceğini gösterir:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

deyiminin On Error GoTo , özel durum sınıfına bakılmaksızın tüm hataları tuzağa düşürdüğünü fark edin.

HataDa Devam Et İleri

On Error Resume Next çalıştırma hatasına neden olan deyimin hemen ardından veya deyimini içeren yordamın en son çağrısından hemen sonra deyimiyle yürütmenin devam etmesi neden On Error Resume Next olur. Bu deyim, çalışma zamanı hatasına rağmen yürütmenin devam etmesine olanak tanır. Denetimi yordam içinde başka bir konuma aktarmak yerine hata işleme yordamını hatanın oluşacağı yere yerleştirebilirsiniz. On Error Resume Next Başka bir yordam çağrıldığında bir deyim devre dışı olur, bu nedenle bu yordam içinde satır içi hata işleme istiyorsanız her çağrılan yordamda bir On Error Resume Next deyimi yürütmeniz gerekir.

Not

Yapı On Error Resume Next , diğer nesnelere On Error GoTo erişim sırasında oluşturulan hataları işlerken tercih edilebilir. Err Bir nesneyle her etkileşimden sonra denetlendikten sonra kod tarafından erişilen nesneyle ilgili belirsizlik ortadan kaldırılır. Hata kodunu Err.Numberiçine hangi nesnenin yerleştirdiği ve hatayı ilk olarak hangi nesnenin oluşturduğundan (içinde Err.Sourcebelirtilen nesne) emin olabilirsiniz.

GoTo 0 Hatasında

On Error GoTo 0 geçerli yordamda hata işlemeyi devre dışı bırakır. Yordam 0 numaralı bir satır içerse bile hata işleme kodunun başlangıcı olarak 0. satırı belirtmez. On Error GoTo 0 Deyimi olmadan, bir yordamdan çıkıldığında hata işleyicisi otomatik olarak devre dışı bırakılır.

GoTo -1 Hatasında

On Error GoTo -1 geçerli yordamda özel durumu devre dışı bırakır. Yordam -1 numaralı bir satır içerse bile hata işleme kodunun başlangıcı olarak -1 satırını belirtmez. Deyim On Error GoTo -1 olmadan, bir yordamdan çıkıldığında özel durum otomatik olarak devre dışı bırakılır.

Hata oluşmadığında hata işleme kodunun çalışmasını önlemek için, aşağıdaki parçada olduğu gibi hata işleme yordamının hemen önüne bir Exit Sub, Exit Functionveya Exit Property deyimi yerleştirin:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

Burada hata işleme kodu deyimini Exit Sub izler ve yordam akışından ayırmak için deyiminin önüne End Sub yer alır. Hata işleme kodunu bir yordamda herhangi bir yere yerleştirebilirsiniz.

Çıkarılmamış Hatalar

Nesne yürütülebilir dosya olarak çalışırken nesnelerdeki izlenmeyen hatalar denetim uygulamasına döndürülür. Geliştirme ortamında, denetlenen uygulamaya yalnızca uygun seçenekler ayarlandıysa, izlenmeyen hatalar döndürülür. Hata ayıklama sırasında hangi seçeneklerin ayarlanması gerektiğine, bunların nasıl ayarlanacağına ve konağın sınıf oluşturup oluşturamayacağına ilişkin bir açıklama için konak uygulamanızın belgelerine bakın.

Diğer nesnelere erişen bir nesne oluşturursanız, bunların geri ilettiği işlenmeyen hataları işlemeyi denemelisiniz. Bunu yapamıyorsanız, içindeki Err.Number hata kodlarını kendi hatalarınızdan biriyle eşleyin ve sonra bunları nesnenizin çağıranına geri geçirin. Hata kodunuzu sabite VbObjectError ekleyerek hatanızı belirtmelisiniz. Örneğin, hata kodunuz 1052 ise, aşağıdaki gibi atayın:

Err.Number = vbObjectError + 1052

Dikkat

Windows dinamik bağlantı kitaplıklarına (DLL) yapılan çağrılar sırasında oluşan sistem hataları özel durum oluşturmaz ve Visual Basic hata yakalama ile yakalanamaz. DLL işlevlerini çağırırken, her dönüş değerinin başarı veya başarısızlık olup olmadığını denetlemeniz (API belirtimlerine göre) ve bir hata durumunda nesnenin ErrLastDLLError özelliğindeki değeri denetlemeniz gerekir.

Örnek

Bu örnekte ilk olarak bir yordam içindeki hata işleme yordamının konumunu belirtmek için deyimi kullanılır On Error GoTo . Örnekte, sıfıra bölme girişimi 6 numaralı hatayı oluşturur. Hata, hata işleme yordamında işlenir ve ardından hataya neden olan deyime denetim döndürülür. deyimi On Error GoTo 0 hata yakalamayı kapatır. On Error Resume Next Ardından deyimi hata yakalamayı ertelemek için kullanılır, böylece bir sonraki deyim tarafından oluşturulan hata bağlamı kesin olarak bilinebilir. Hata işlendikten Err.Clear sonra nesnenin Err özelliklerini temizlemek için kullanıldığını unutmayın.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Gereksinimler

Ad Alanı:Microsoft.VisualBasic

Derleme: Visual Basic Çalışma Zamanı Kitaplığı (Microsoft.VisualBasic.dll)

Ayrıca bkz.