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
GoToline 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