Ketika sebuah error terjadi di dalam sebuah prosedur yang mengakibatkan rutin penanganan error menjadi aktif, atau di dalam sebuah rutin penanganan error yang aktif, Visual Basic mencari daftar panggilan untuk rutin penanganan error yang aktif lainnya. Daftar panggilan adalah urutan panggilan yang mengarah ke pengeksekusian prosedur yang ada; dan dia ditampilkan di dalam kotak dialog Call Stack. Anda dapat menampilkan kotak dialog Call Stack hanya ketika dalam mode break (break-mode) ketika Anda mem-pause pengeksekusian aplikasi Anda, dengan memilih menu: View, Call Stack atau dengan menekan tombol CTRL+L di keyboard Anda.
Pencarian Daftar Panggilan
Misalkan urutan panggilan berikut terjadi, seperti yang ditunjukkan di gambar bawah:
1. Sebuah prosedur event Form_Load memanggil ProcedureA.
2. ProcedureA memanggil ProcedureB.
3. ProcedureB memanggil ProcedureC
Cobalah buat kode seperti di atas pada sebuah form. Lalu, untuk menjalankannya, cukup tekan tombol F8 beberapa kali sampai IDE VB6 menyorot di baris kode MsgBox “ProcedureC”, kemudian tekan tombol CTRL+L di keyboard, sehingga muncul kotak dialog Call Stack.
Ketika ProcedureC sedang dieksekusi, maka procedure lainnya (Form_Load, ProcedureA, dan ProcedureB) ditunda, seperti yang ditunjukkan di daftar panggilan pada kotak dialog Call Stack.
Jika sebuah error terjadi di dalam ProcedureC dan procedure ini tidak memiliki sebuah penanganan error yang aktif, Visual Basic mencari kembali melalui procedure-procedure yang ditunda pengeksekusiannya di dalam daftar panggilan — pertama ProcedureB, lalu ProcedureA, kemudian ke event procedure awal (tapi tidak lebih jauh) — dan mengeksekusi penanganan error yang ditemukan pertama aktif. Jika tidak ada satu pun ditemukan penanganan error yang aktif di daftar panggilan, dia menyebabkan sebuah pesan error yang tidak diharapkan dan menghentikan pengeksekusian program Anda.
Jika Visual Basic menemukan sebuah rutin penanganan error yang aktif, pengeksekusian melanjutkan di dalam rutin tersebut jika error telah terjadi di dalam prosedur yang sama yang berisi penanganan error tersebut. Jika sebuah pernyataan Resume atau Resume Next dieksekusi di dalam rutin penanganan error, pengeksekusian melanjutkan seperti yang ditampilkan pada tabel berikut.
Statement Result
Resume Pemanggilan ke procedure yang Visual Basic baru saja cari dieksekusi ulang. Di dalam daftar panggilan yang telah diberikan sebelumnya, jika ProcedureA memiliki sebuah penanganan error yang aktif yang mengandung pernyataan Resume, maka Visual Basic mengeksekusi ulang pemanggilan ke ProcedureB.
Resume Next Pengeksekusian kembali ke pernyataan yang mengikuti pernyataan terakhir yang dieksekusi di dalam procedure itu. Ini adalah pernyataan yang mengikuti pemanggilan ke procedure yang Visual Basic baru saja cari mundur ke belakang. Di dalam daftar panggilan yang sudah diberikan sebelumnya, jika ProcedureA memiliki sebuah penanganan error yang aktif yang mengandung pernyataan Resume Next, pengeksekusian kembali ke pernyataan setelah pemanggilan ke ProcedureB.
Perlu diingat bahwa pernyataan yang dieksekusi di dalam procedure di mana prosedur yang memiliki penanganan error ditemukan, tidak perlu di dalam procedure di mana error terjadi. Jika Anda tidak memperhitungkan hal ini, maka kode Anda mungkin akan menghasilkan sesuatu yang tidak Anda harapkan. Untuk membuat kode lebih mudah didebug, Anda dapat lompat ke mode break ketika sebuah error terjadi, seperti yang akan dijelaskan pada artikel berikutnya yang berjudul Mematikan Penanganan Error di Visual Basic 6.
Jika range penanganan error dari suatu error tidak menyertakan error yang benar-benar terjadi, sebuah error yang tidak dapat diantisipasi dapat terjadi di dalam procedure yang penanganan error-nya aktif. Dalam hal seperti itu terjadi, procedure dapat mengeksekusi tanpa ada hentinya, khususnya jika penanganan error mengeksekusi sebuah pernyataan Resume. Untuk mencegah hal ini, gunakanlah method Raise milik object Err di dalam sebuah pernyataan Case Else di dalam penanganan error. Hal ini sebenarnya membangkitkan sebuah error di dalam penanganan error itu sendiri, tapi memaksa Visual Basic untuk menelusuri daftar panggilan untuk sebuah penanganan error yang sesuai dengan error tersebut.
Pada contoh prosedur ApakahFileAda di artikel sebelum ini, angka asli yang terdapat di dalam Err.Number ditugaskan ke sebuah variabel, intErrNum, yang kemudian dilewatkan sebagai sebuah argumen ke method Raise dari object Err di dalam sebuah pernyataan Case Else, dengan cara demikian membangkitkan sebuah error. Ketika error seperti itu terjadi di dalam sebuah penanganan error yang aktif, pencarian kembali ke daftar panggilan dimulai.
Mengalokasikan Error ke Penanganan Error yang Berbeda
Sulit untuk memprediksi efek dari pencarian kembali ke daftar panggilan, karena dia tergantung pada apakah Resume atau Resume Next dieksekusi di dalam penanganan error yang berhasil memproses error. Resume mengembalikan pengawasan ke eksekusi panggilan prosedur terakhir procedure yang mengandung penanganan error. Resume Next mengembalikan pengawasan ke pernyataan apapun yang mengikuti setelah pemanggilan terakhir yang dieksekusi dari prosedur yang mengandung penanganan error.
Sebagai contoh, di dalam daftar panggilan pada gambar di atas, jika ProcedureA memiliki sebuah penanganan error yang aktif, sedangkan ProcedureB maupun ProcedureC tidak, sebuah error yang sedang terjadi di dalam ProcedureC akan ditanganai oleh penanganan error milik ProcedureA. Jika penanganan error tersebut menggunakan sebuah pernyataan Resume, sebelum baris Exit, program melanjutkan dengan sebuah panggilan ke ProcedureB. Namun, jika penanganan error di dalam ProcedureA menggunakan sebuah pernyataan Resume Next, sebelum baris Exit, program akan melanjutkan pada pernyataan apapun di dalam ProcedureA yang mengikuti pemanggilan ke ProcedureB. Di dua kasus tersebut, penanganan error tidak langsung kembali ke procedure atau pernyataan di mana error pertama kali terjadi.
Petunjuk untuk Penanganan Error yang Kompleks
Ketika Anda membuat aplikasi Visual Basic yang relatif besar menggunakan banyak modules, kode penanganan error dapat menjadi kompleks. Ingatlah petunjuk berikut:
* Ketika Anda sedang mendebug kode Anda, gunakan method Raise dari object Err untuk membangkitkan ulang error di semua penanganan error untuk kasus di mana tidak ada kode penanganan error yang sesuai dengan error tersebut. Hal ini membolehkan aplikasi Anda untuk mencoba memperbaiki error di rutin penanganan error lainnya yang terdapat dalam daftar panggilan. Dia juga memastikan bahwa Visual Basic akan menampilkan sebuah pesan error jika error terjadi dan kode Anda tidak menanganinya. Ketika Anda mencoba kode Anda, teknik ini membantu Anda menemukan error yang tidak dapat dideteksi secukupnya. Namun, dalam sebuah file .exe yang berdiri sendiri, Anda sebaiknya berhati-hati: Jika Anda mengeksekusi method Raise dan tidak ada procedure lainnya menangkap error tadi, aplikasi Anda akan langsung menghentikan pengeksekusian program, tanpa menjalankan QueryUnload atau Unload.
* Gunakan method Clear jika Anda perlu membersihkan secara eksplisit object Err setelah menanganai sebuah error. Hal ini perlu ketika sedang menggunakan penanganan error di dalam baris dengan On Error Resume Next. Visual Basic memanggil method Clear secara otomatis ketika dia mengeksekusi tipe apapun dari pernyataan Resume, Exit Sub, Exit Function, Exit Property, atau pernyataan On Error apapun.
* Jika Anda tidak menginginkan procedure lainnya yang terdapat di dalam daftar panggilan untuk menangkap error, gunakan pernyataan Stop untuk memaksa kode Anda berhenti. Dengan menggunakan Stop akan memeriksa hubungan error ketika memperbaiki kode Anda di dalam lingkungan pengembangan. Harap diperhatikan, pastikan untuk menghapus pernyataan Stop sebelum Anda membuat program Anda menjadi file .exe. Jika sebuah aplikasi Visual Basic yang berdiri sendiri (.exe) menjalankan sebuah pernyataan Stop, dia memperlakukannya sebagai sebuah pernyataan End dan langsung menghentikan pengeksekusian kode Anda saat itu juga, tanpa mengeksekusi QueryUnload atau Unload.
* Buatlah sebuah prosedur dengan penanganan error yang menyelamatkan yang gagal, di mana semua penanganan error Anda dapat memanggil ke sebagai sebuah tempat terakhir untuk error-error yang tidak dapat mereka tangani. Hal ini dapat melakukan penghentian aplikasi secara berurut dengan membebaskan forms dan menyimpan data dengan aman.
Pencarian Daftar Panggilan
Misalkan urutan panggilan berikut terjadi, seperti yang ditunjukkan di gambar bawah:
1. Sebuah prosedur event Form_Load memanggil ProcedureA.
2. ProcedureA memanggil ProcedureB.
3. ProcedureB memanggil ProcedureC
Cobalah buat kode seperti di atas pada sebuah form. Lalu, untuk menjalankannya, cukup tekan tombol F8 beberapa kali sampai IDE VB6 menyorot di baris kode MsgBox “ProcedureC”, kemudian tekan tombol CTRL+L di keyboard, sehingga muncul kotak dialog Call Stack.
Ketika ProcedureC sedang dieksekusi, maka procedure lainnya (Form_Load, ProcedureA, dan ProcedureB) ditunda, seperti yang ditunjukkan di daftar panggilan pada kotak dialog Call Stack.
Jika sebuah error terjadi di dalam ProcedureC dan procedure ini tidak memiliki sebuah penanganan error yang aktif, Visual Basic mencari kembali melalui procedure-procedure yang ditunda pengeksekusiannya di dalam daftar panggilan — pertama ProcedureB, lalu ProcedureA, kemudian ke event procedure awal (tapi tidak lebih jauh) — dan mengeksekusi penanganan error yang ditemukan pertama aktif. Jika tidak ada satu pun ditemukan penanganan error yang aktif di daftar panggilan, dia menyebabkan sebuah pesan error yang tidak diharapkan dan menghentikan pengeksekusian program Anda.
Jika Visual Basic menemukan sebuah rutin penanganan error yang aktif, pengeksekusian melanjutkan di dalam rutin tersebut jika error telah terjadi di dalam prosedur yang sama yang berisi penanganan error tersebut. Jika sebuah pernyataan Resume atau Resume Next dieksekusi di dalam rutin penanganan error, pengeksekusian melanjutkan seperti yang ditampilkan pada tabel berikut.
Statement Result
Resume Pemanggilan ke procedure yang Visual Basic baru saja cari dieksekusi ulang. Di dalam daftar panggilan yang telah diberikan sebelumnya, jika ProcedureA memiliki sebuah penanganan error yang aktif yang mengandung pernyataan Resume, maka Visual Basic mengeksekusi ulang pemanggilan ke ProcedureB.
Resume Next Pengeksekusian kembali ke pernyataan yang mengikuti pernyataan terakhir yang dieksekusi di dalam procedure itu. Ini adalah pernyataan yang mengikuti pemanggilan ke procedure yang Visual Basic baru saja cari mundur ke belakang. Di dalam daftar panggilan yang sudah diberikan sebelumnya, jika ProcedureA memiliki sebuah penanganan error yang aktif yang mengandung pernyataan Resume Next, pengeksekusian kembali ke pernyataan setelah pemanggilan ke ProcedureB.
Perlu diingat bahwa pernyataan yang dieksekusi di dalam procedure di mana prosedur yang memiliki penanganan error ditemukan, tidak perlu di dalam procedure di mana error terjadi. Jika Anda tidak memperhitungkan hal ini, maka kode Anda mungkin akan menghasilkan sesuatu yang tidak Anda harapkan. Untuk membuat kode lebih mudah didebug, Anda dapat lompat ke mode break ketika sebuah error terjadi, seperti yang akan dijelaskan pada artikel berikutnya yang berjudul Mematikan Penanganan Error di Visual Basic 6.
Jika range penanganan error dari suatu error tidak menyertakan error yang benar-benar terjadi, sebuah error yang tidak dapat diantisipasi dapat terjadi di dalam procedure yang penanganan error-nya aktif. Dalam hal seperti itu terjadi, procedure dapat mengeksekusi tanpa ada hentinya, khususnya jika penanganan error mengeksekusi sebuah pernyataan Resume. Untuk mencegah hal ini, gunakanlah method Raise milik object Err di dalam sebuah pernyataan Case Else di dalam penanganan error. Hal ini sebenarnya membangkitkan sebuah error di dalam penanganan error itu sendiri, tapi memaksa Visual Basic untuk menelusuri daftar panggilan untuk sebuah penanganan error yang sesuai dengan error tersebut.
Pada contoh prosedur ApakahFileAda di artikel sebelum ini, angka asli yang terdapat di dalam Err.Number ditugaskan ke sebuah variabel, intErrNum, yang kemudian dilewatkan sebagai sebuah argumen ke method Raise dari object Err di dalam sebuah pernyataan Case Else, dengan cara demikian membangkitkan sebuah error. Ketika error seperti itu terjadi di dalam sebuah penanganan error yang aktif, pencarian kembali ke daftar panggilan dimulai.
Mengalokasikan Error ke Penanganan Error yang Berbeda
Sulit untuk memprediksi efek dari pencarian kembali ke daftar panggilan, karena dia tergantung pada apakah Resume atau Resume Next dieksekusi di dalam penanganan error yang berhasil memproses error. Resume mengembalikan pengawasan ke eksekusi panggilan prosedur terakhir procedure yang mengandung penanganan error. Resume Next mengembalikan pengawasan ke pernyataan apapun yang mengikuti setelah pemanggilan terakhir yang dieksekusi dari prosedur yang mengandung penanganan error.
Sebagai contoh, di dalam daftar panggilan pada gambar di atas, jika ProcedureA memiliki sebuah penanganan error yang aktif, sedangkan ProcedureB maupun ProcedureC tidak, sebuah error yang sedang terjadi di dalam ProcedureC akan ditanganai oleh penanganan error milik ProcedureA. Jika penanganan error tersebut menggunakan sebuah pernyataan Resume, sebelum baris Exit, program melanjutkan dengan sebuah panggilan ke ProcedureB. Namun, jika penanganan error di dalam ProcedureA menggunakan sebuah pernyataan Resume Next, sebelum baris Exit, program akan melanjutkan pada pernyataan apapun di dalam ProcedureA yang mengikuti pemanggilan ke ProcedureB. Di dua kasus tersebut, penanganan error tidak langsung kembali ke procedure atau pernyataan di mana error pertama kali terjadi.
Petunjuk untuk Penanganan Error yang Kompleks
Ketika Anda membuat aplikasi Visual Basic yang relatif besar menggunakan banyak modules, kode penanganan error dapat menjadi kompleks. Ingatlah petunjuk berikut:
* Ketika Anda sedang mendebug kode Anda, gunakan method Raise dari object Err untuk membangkitkan ulang error di semua penanganan error untuk kasus di mana tidak ada kode penanganan error yang sesuai dengan error tersebut. Hal ini membolehkan aplikasi Anda untuk mencoba memperbaiki error di rutin penanganan error lainnya yang terdapat dalam daftar panggilan. Dia juga memastikan bahwa Visual Basic akan menampilkan sebuah pesan error jika error terjadi dan kode Anda tidak menanganinya. Ketika Anda mencoba kode Anda, teknik ini membantu Anda menemukan error yang tidak dapat dideteksi secukupnya. Namun, dalam sebuah file .exe yang berdiri sendiri, Anda sebaiknya berhati-hati: Jika Anda mengeksekusi method Raise dan tidak ada procedure lainnya menangkap error tadi, aplikasi Anda akan langsung menghentikan pengeksekusian program, tanpa menjalankan QueryUnload atau Unload.
* Gunakan method Clear jika Anda perlu membersihkan secara eksplisit object Err setelah menanganai sebuah error. Hal ini perlu ketika sedang menggunakan penanganan error di dalam baris dengan On Error Resume Next. Visual Basic memanggil method Clear secara otomatis ketika dia mengeksekusi tipe apapun dari pernyataan Resume, Exit Sub, Exit Function, Exit Property, atau pernyataan On Error apapun.
* Jika Anda tidak menginginkan procedure lainnya yang terdapat di dalam daftar panggilan untuk menangkap error, gunakan pernyataan Stop untuk memaksa kode Anda berhenti. Dengan menggunakan Stop akan memeriksa hubungan error ketika memperbaiki kode Anda di dalam lingkungan pengembangan. Harap diperhatikan, pastikan untuk menghapus pernyataan Stop sebelum Anda membuat program Anda menjadi file .exe. Jika sebuah aplikasi Visual Basic yang berdiri sendiri (.exe) menjalankan sebuah pernyataan Stop, dia memperlakukannya sebagai sebuah pernyataan End dan langsung menghentikan pengeksekusian kode Anda saat itu juga, tanpa mengeksekusi QueryUnload atau Unload.
* Buatlah sebuah prosedur dengan penanganan error yang menyelamatkan yang gagal, di mana semua penanganan error Anda dapat memanggil ke sebagai sebuah tempat terakhir untuk error-error yang tidak dapat mereka tangani. Hal ini dapat melakukan penghentian aplikasi secara berurut dengan membebaskan forms dan menyimpan data dengan aman.


No comments:
Post a Comment