Bagikan melalui


Pernyataan try-except (C)

Microsoft-specific

Pernyataan try-except merupakan ekstensi Microsoft ke bahasa C yang memungkinkan aplikasi untuk mendapatkan kontrol atas program ketika terjadi peristiwa yang biasanya menghentikan eksekusi. Peristiwa tersebut disebut pengecualian, dan mekanisme yang menghadapi pengecualian disebut penanganan pengecualian terstruktur.

Pengecualian dapat berbasis perangkat keras atau perangkat lunak. Bahkan ketika aplikasi tidak dapat sepenuhnya pulih dari pengecualian perangkat keras atau perangkat lunak, penanganan pengecualian terstruktur memungkinkan untuk mencatat dan menampilkan informasi kesalahan. Hal ini berguna untuk menjebak status internal aplikasi untuk membantu mendiagnosis masalah. Secara khusus, sangat membantu untuk menghadapi masalah terputus-terputus yang tidak mudah direproduksi.

Sintaks

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Pernyataan gabungan setelah klausul __try adalah bagian yang dijaga. Pernyataan gabungan setelah klausul __except adalah penangan pengecualian. Penangan menentukan serangkaian tindakan yang harus dilakukan jika pengecualian dinaikkan selama eksekusi bagian yang dijaga. Eksekusi berlangsung sebagai berikut:

  1. Bagian yang dijaga dijalankan.

  2. Jika pengecualian tidak terjadi selama eksekusi bagian yang dijaga, eksekusi berlanjut pada pernyataan setelah klausul __except.

  3. Jika pengecualian terjadi selama eksekusi bagian yang dijaga, atau dalam rutin apa pun yang dipanggil bagian yang dijaga, ekspresi __except akan dievaluasi. Nilai yang muncul menentukan bagaimana pengecualian akan ditangani. Ada tiga nilai yang memungkinkan:

    • EXCEPTION_CONTINUE_SEARCH: Pengecualian tidak dikenali. Lanjutkan mencari penangan di tumpukan, pertama yang berisi pernyataan try-except, lalu penangan dengan urutan tertinggi berikutnya.

    • EXCEPTION_CONTINUE_EXECUTION: Pengecualian dikenali, tetapi dihentikan. Lanjutkan eksekusi pada titik di mana pengecualian terjadi.

    • EXCEPTION_EXECUTE_HANDLER Pengecualian dikenali. Transfer kontrol ke penangan pengecualian dengan menjalankan pernyataan gabungan __except, lalu lanjutkan eksekusi pada titik pengecualian terjadi.

Karena ekspresi __except dievaluasi sebagai ekspresi C, ekspresi tersebut hanya terbatas pada nilai tunggal, operator ekspresi percabangan, atau operator koma. Jika diperlukan pemrosesan yang lebih ekstensif, ekspresi dapat memanggil sebuah rutin yang mengembalikan salah satu dari tiga nilai yang tercantum di atas.

Catatan

Penanganan pengecualian terstruktur berfungsi dengan file sumber C dan C++. Namun, ini tidak dirancang khusus untuk C++. Untuk program C++ portabel, penanganan pengecualian C++ harus digunakan dan bukan penanganan pengecualian terstruktur. Selain itu, mekanisme penanganan pengecualian C++ jauh lebih fleksibel, karena dapat menangani pengecualian dari jenis apa pun. Untuk informasi selengkapnya, lihat Penanganan pengecualian di Referensi Bahasa C++.

Setiap rutin dalam sebuah aplikasi dapat memiliki penangan pengecualiannya sendiri. Ekspresi __except berjalan dalam cakupan isi __try. Ekspresi tersebut memiliki akses ke variabel lokal apa pun yang dinyatakan di sana.

Kata kunci __leave valid dalam blok pernyataan try-except. Efek dari __leave adalah melompat ke ujung blok try-except. Eksekusi dilanjutkan setelah penanganan pengecualian selesai. Meskipun pernyataan goto dapat digunakan untuk mencapai hasil yang sama, pernyataan goto menyebabkan stack unwinding. Pernyataan __leave ini lebih efisien karena tidak melibatkan pelepasan tumpukan.

Keluar dari pernyataan try-except menggunakan fungsi run-time longjmp dianggap sebagai penghentian abnormal. Melompat ke pernyataan __try dianggap tidak legal, tetapi melompat keluar darinya dianggap legal. Penangan pengecualian tidak dipanggil jika proses dihentikan di tengah-tengah menjalankan pernyataan try-except.

Contoh

Berikut adalah contoh penangan pengecualian dan penangan penghentian. Untuk informasi selengkapnya tentang penangan penghentian, lihat try-finally pernyataan (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Berikut adalah output dari contoh, dengan komentar yang ditambahkan di sebelah kanan:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

END Microsoft-specific

Lihat juga

try-except pernyataan (C++)