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.
Sözdizimi
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Parça
Süre | Tanım |
---|---|
GoTo satı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 Nothing sıfırlar. |
GoTo -1 |
Geçerli yordamda etkin özel durumu devre dışı bırakır ve olarak Nothing sı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... Tutmak... 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 Function
veya 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.Description
yer 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.Number
içine hangi nesnenin yerleştirdiği ve hatayı ilk olarak hangi nesnenin oluşturduğundan (içinde Err.Source
belirtilen 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 Function
veya 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 Err
LastDLLError
ö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)