Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
Bagian yang dijaga dijalankan.
Jika pengecualian tidak terjadi selama eksekusi bagian yang dijaga, eksekusi berlanjut pada pernyataan setelah klausul
__except
.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 pernyataantry-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