Pernyataan On Error (Visual Basic)
Mengaktifkan rutinitas penanganan kesalahan dan menentukan lokasi rutinitas dalam prosedur; juga dapat digunakan untuk menonaktifkan rutinitas penanganan kesalahan. Pernyataan On Error
ini digunakan dalam penanganan kesalahan yang tidak terstruktur dan dapat digunakan alih-alih penanganan pengecualian terstruktur. Penanganan pengecualian terstruktur dibangun ke dalam .NET, umumnya lebih efisien, dan karenanya sangat disarankan saat menangani kesalahan runtime dalam aplikasi Anda.
Tanpa penanganan kesalahan atau penanganan pengecualian, kesalahan run-time apa pun yang terjadi bersifat fatal: pesan kesalahan ditampilkan, dan eksekusi berhenti.
Catatan
Kata kunci Error
juga digunakan dalam Pernyataan Kesalahan, yang didukung untuk kompatibilitas mundur.
Sintaks
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Generator
Term | Definisi |
---|---|
GoTo line |
Mengaktifkan rutinitas penanganan kesalahan yang dimulai pada baris yang ditentukan dalam argumen line yang diperlukan. Argumen line adalah label baris atau nomor baris apa pun. Jika terjadi kesalahan run-time, kontrol cabang ke baris yang ditentukan, membuat penangan kesalahan aktif. Baris yang ditentukan harus dalam prosedur yang sama dengan pernyataan On Error bila tidak kesalahan waktu kompilasi akan terjadi. |
GoTo 0 |
Menonaktifkan penangan kesalahan yang diaktifkan dalam prosedur saat ini dan mengatur ulang ke Nothing . |
GoTo -1 |
Menonaktifkan pengecualian yang diaktifkan dalam prosedur saat ini dan mengatur ulang ke Nothing . |
Resume Next |
Menentukan bahwa ketika kesalahan run-time terjadi, kontrol masuk ke pernyataan segera mengikuti pernyataan di mana kesalahan terjadi, dan eksekusi berlanjut dari titik itu. Gunakan formulir ini daripada On Error GoTo saat mengakses objek. |
Keterangan
Catatan
Kami menyarankan agar Anda menggunakan penanganan pengecualian terstruktur dalam kode Anda jika memungkinkan, daripada menggunakan penanganan pengecualian yang tidak terstruktur dan pernyataan On Error
. Untuk informasi selengkapnya, lihat Pernyataan Try...Catch...Finally.
Handler kesalahan "diaktifkan" adalah penangan kesalahan yang diaktifkan oleh pernyataan On Error
. Handler kesalahan "aktif" adalah handler yang diaktifkan yang sedang dalam proses menangani kesalahan.
Jika terjadi kesalahan saat penangan kesalahan aktif (antara terjadinya kesalahan dan pernyataan Resume
, Exit Sub
, Exit Function
, atau Exit Property
), penangan kesalahan prosedur saat ini tidak dapat menangani kesalahan. Kontrol kembali ke prosedur panggilan.
Jika prosedur panggilan memiliki handler kesalahan yang diaktifkan, prosedur diaktifkan untuk menangani kesalahan. Jika penangan kesalahan prosedur panggilan juga aktif, kontrol berjalan kembali prosedur panggilan sebelumnya hingga diaktifkan, bila tidak aktif, penangan kesalahan akan ditemukan. Jika tidak ada penangan kesalahan seperti itu yang ditemukan, kesalahan menjadi fatal pada titik di mana kesalahan itu terjadi.
Setiap kali handler kesalahan meneruskan kontrol kembali ke prosedur panggilan, prosedur tersebut menjadi prosedur saat ini. Setelah kesalahan ditangani oleh penangan kesalahan dalam prosedur apa pun, eksekusi dilanjutkan dalam prosedur saat ini pada titik yang ditentukan oleh pernyataan Resume
.
Catatan
Rutinitas penanganan kesalahan bukanlah prosedur Sub
atau prosedur Function
. Ini adalah bagian kode yang ditandai dengan label baris atau nomor baris.
Properti Angka
Rutinitas penanganan kesalahan bergantung pada nilai dalam properti Number
dari objek Err
untuk menentukan penyebab kesalahan. Rutinitas harus menguji atau menyimpan nilai properti yang relevan dalam objek Err
sebelum kesalahan lain dapat terjadi atau sebelum prosedur yang dapat menyebabkan kesalahan dipanggil. Nilai properti dalam objek Err
hanya mencerminkan kesalahan terbaru. Pesan kesalahan yang terkait dengan Err.Number
terkandung dalam Err.Description
.
Pernyataan Throw (Lempar)
Kesalahan yang muncul dengan metode Err.Raise
mengatur properti Exception
ke instans yang baru dibuat dari kelas Exception. Untuk mendukung pemunculan pengecualian dari jenis pengecualian turunan, pernyataan Throw
didukung dalam bahasa itu. Ini membutuhkan satu parameter yang merupakan instans pengecualian yang akan dilemparkan. Contoh berikut menunjukkan bagaimana fitur-fitur ini dapat digunakan dengan dukungan penanganan pengecualian yang ada:
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
Perhatikan bahwa pernyataan On Error GoTo
tersebut menjebak semua kesalahan, terlepas dari kelas pengecualiannya.
On Error Resume Next
On Error Resume Next
menyebabkan eksekusi berlanjut dengan pernyataan itu segera setelah pernyataan yang menyebabkan kesalahan run-time, atau dengan pernyataan yang segera mengikuti panggilan terbaru dari prosedur yang berisi pernyataan On Error Resume Next
. Pernyataan ini memungkinkan eksekusi untuk berlanjut meskipun terjadi kesalahan run-time. Anda dapat menempatkan rutinitas penanganan kesalahan di mana kesalahan akan terjadi daripada mentransfer kontrol ke lokasi lain dalam prosedur tersebut. Pernyataan On Error Resume Next
menjadi tidak aktif ketika prosedur lain dipanggil, jadi Anda harus menjalankan pernyataan On Error Resume Next
di setiap rutinitas yang dipanggil jika Anda ingin penanganan kesalahan sebaris dalam rutinitas tersebut.
Catatan
Konstruksi On Error Resume Next
mungkin lebih disukai daripada On Error GoTo
saat menangani kesalahan yang dihasilkan selama akses ke objek lain. Memeriksa Err
setelah setiap interaksi dengan objek menghapus ambiguitas tentang objek mana yang diakses oleh kode. Anda dapat memastikan objek mana yang menempatkan kode kesalahan di Err.Number
, serta objek mana yang awalnya menghasilkan kesalahan (objek yang ditentukan dalam Err.Source
).
On Error GoTo 0
On Error GoTo 0
menonaktifkan penanganan kesalahan dalam prosedur saat ini. Tidak menentukan baris 0 sebagai awal kode penanganan kesalahan, bahkan jika prosedur memuat baris bernomor 0. Tanpa pernyataan On Error GoTo 0
, penangan kesalahan secara otomatis dinonaktifkan saat prosedur dikeluarkan.
On Error GoTo -1
On Error GoTo -1
menonaktifkan pengecualian dalam prosedur saat ini. Tidak menentukan baris -1 sebagai awal kode penanganan kesalahan, bahkan jika prosedur berisi baris bernomor -1. Tanpa pernyataan On Error GoTo -1
, pengecualian secara otomatis dinonaktifkan saat prosedur dikeluarkan.
Untuk mencegah kode penanganan kesalahan berjalan ketika tidak ada kesalahan yang terjadi, tempatkan pernyataan Exit Sub
, Exit Function
, atau Exit Property
segera sebelum rutinitas penanganan kesalahan, seperti dalam fragmen berikut:
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
Di sini, kode penanganan kesalahan mengikuti pernyataanExit Sub
dan mendahului pernyataan End Sub
untuk memisahkannya dari alur prosedur. Anda dapat menempatkan kode penanganan kesalahan di mana saja dalam prosedur.
Kesalahan Tidak Terlacak
Kesalahan yang tidak dilacak dalam objek dikembalikan ke aplikasi pengontrol ketika objek berjalan sebagai file yang dapat dieksekusi. Dalam lingkungan pengembangan, kesalahan yang tidak dilacak dikembalikan ke aplikasi pengontrol hanya jika opsi yang tepat telah dipilih. Lihat dokumentasi aplikasi host Anda untuk deskripsi opsi mana yang harus diatur selama penelusuran kesalahan, cara mengaturnya, dan apakah host dapat membuat kelas.
Jika Anda membuat objek yang mengakses objek lain, Anda harus mencoba menangani kesalahan yang tidak tertangani yang diteruskan kembali. Jika tidak dapat, petakan kode kesalahan Err.Number
ke salah satu kesalahan Anda sendiri lalu teruskan kembali ke pemanggil objek Anda. Anda harus menentukan kesalahan Anda dengan menambahkan kode kesalahan Anda ke konstanta VbObjectError
. Misalnya, jika kode kesalahan Anda adalah 1052, tetapkan sebagai berikut:
Err.Number = vbObjectError + 1052
Perhatian
Kesalahan sistem selama panggilan ke pustaka tautan dinamis (DLL) Windows tidak menimbulkan pengecualian dan tidak dapat terjebak dengan perangkap kesalahan Visual Basic. Saat memanggil fungsi DLL, Anda harus memeriksa setiap nilai pengembalian untuk mengetahui berhasil atau gagal (sesuai dengan spesifikasi API), dan jika terjadi kegagalan, periksa nilai pada properti LastDLLError
objek Err
.
Contoh
Contoh ini pertama-tama menggunakan pernyataan On Error GoTo
untuk menentukan lokasi rutinitas penanganan kesalahan dalam prosedur. Dalam contoh, upaya untuk membagi dengan nol menghasilkan nomor kesalahan 6. Kesalahan ditangani dalam rutinitas penanganan kesalahan, dan kontrol kemudian dikembalikan ke pernyataan yang menyebabkan kesalahan. Pernyataan On Error GoTo 0
mematikan perangkap kesalahan. Kemudian pernyataan On Error Resume Next
digunakan untuk menangguhkan penjebakan kesalahan sehingga konteks untuk kesalahan yang dihasilkan oleh pernyataan berikutnya dapat diketahui secara pasti. Perhatikan bahwa Err.Clear
digunakan untuk menghapus properti objek Err
setelah kesalahan ditangani.
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
Persyaratan
Kumpulan Nama:Microsoft.VisualBasic
Perakitan: Pustaka Runtime Visual Basic (di Microsoft.VisualBasic.dll)
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk