try-finally
pernyataan
Pernyataan ini try-finally
adalah ekstensi khusus Microsoft yang mendukung penanganan pengecualian terstruktur dalam bahasa C dan C++.
Sintaks
Sintaks berikut menjelaskan try-finally
pernyataan:
// . . .
__try {
// guarded code
}
__finally {
// termination code
}
// . . .
Tatabahasa
try-finally-statement
:
__try
compound-statement
__finally
compound-statement
Pernyataan ini try-finally
adalah ekstensi Microsoft untuk bahasa C dan C++ yang memungkinkan aplikasi target menjamin eksekusi kode pembersihan saat eksekusi blok kode terganggu. Pembersihan terdiri dari tugas-tugas seperti membatalkan alokasi memori, menutup file, dan melepaskan penanganan file. Pernyataan try-finally
sangat berguna untuk rutinitas yang memiliki beberapa tempat di mana pemeriksaan dibuat untuk kesalahan yang dapat menyebabkan pengembalian prematur dari rutinitas.
Untuk informasi terkait dan sampel kode, lihat try-except
Pernyataan. Untuk informasi selengkapnya tentang penanganan pengecualian terstruktur secara umum, lihat Penanganan Pengecualian Terstruktur. Untuk informasi selengkapnya tentang menangani pengecualian dalam aplikasi terkelola dengan C++/CLI, lihat Penanganan Pengecualian di bawah /clr
.
Catatan
Penanganan pengecualian terstruktur berfungsi dengan Win32 untuk file sumber C dan C++. Namun, ini tidak dirancang khusus untuk C++. Anda dapat memastikan bahwa kode Anda lebih portabel dengan menggunakan penanganan pengecualian C++. Selain itu, penanganan pengecualian C++ lebih fleksibel, karena dapat menangani pengecualian dari jenis apa pun. Untuk program C++, disarankan agar Anda menggunakan mekanisme penanganan pengecualian C++ (try
, catch
, dan throw
pernyataan).
Pernyataan majemuk setelah klausa __try
adalah bagian yang dijaga. Pernyataan majemuk setelah klausa __finally
adalah penangan penghentian. Handler menentukan sekumpulan tindakan yang dijalankan ketika bagian yang dijaga keluar, apakah keluar dari bagian yang dijaga dengan pengecualian (penghentian abnormal), atau secara standar jatuh melalui (penghentian normal).
Kontrol mencapai pernyataan __try
dengan eksekusi sekuensial sederhana (jatuh). Saat kontrol memasuki __try
, handler terkait menjadi aktif. Jika alur kontrol mencapai akhir blok coba, eksekusi berlanjut sebagai berikut:
Penangan penghentian dipanggil.
Ketika penangan penghentian selesai, eksekusi berlanjut setelah pernyataan
__finally
. Namun bagian yang dijaga berakhir (misalnya, melaluigoto
isi yang dijaga ataureturn
pernyataan), handler penghentian dijalankan sebelum alur kontrol bergerak keluar dari bagian yang dijaga.Pernyataan
__finally
tidak memblokir pencarian penanganan pengecualian yang sesuai.
Jika pengecualian terjadi di __try
blok, sistem operasi harus menemukan handler untuk pengecualian, atau program akan gagal. Jika handler ditemukan, setiap dan semua __finally
blok dijalankan dan eksekusi dilanjutkan di handler.
Misalnya, serangkaian fungsi memanggil tautan fungsi A ke fungsi D, seperti yang ditunjukkan pada gambar berikut. Setiap fungsi memiliki satu handler penghentian. Jika pengecualian dinaikkan dalam fungsi D dan ditangani di A, handler penghentian dipanggil dalam urutan ini karena sistem melepas tumpukan: D, C, B.
Diagram dimulai dengan fungsi A, yang memanggil fungsi B, yang memanggil fungsi C, yang memanggil fungsi D. Fungsi D menimbulkan pengecualian. Handler penghentian kemudian dipanggil dalam urutan ini: handler penghentian D, lalu C, kemudian B, dan kemudian A menangani pengecualian.
Urutan eksekusi penghentian-handler
Catatan
Perilaku try-finally berbeda dari beberapa bahasa lain yang mendukung penggunaan finally
, seperti C#. Satu __try
mungkin memiliki baik, tetapi tidak keduanya, dari __finally
dan __except
. Jika keduanya akan digunakan bersama-sama, pernyataan try-except luar harus menyertakan pernyataan try-finally dalam. Aturan yang menentukan kapan setiap blok dijalankan juga berbeda.
Untuk kompatibilitas dengan versi sebelumnya, _try
, , _finally
dan _leave
merupakan sinonim untuk __try
, , __finally
dan __leave
kecuali opsi /Za
pengompilasi (Nonaktifkan ekstensi bahasa) ditentukan.
Kata kunci __leave
Kata __leave
kunci hanya valid dalam bagian yang dijaga dari pernyataan try-finally
, dan efeknya adalah melompat ke akhir bagian yang dijaga. Eksekusi berlanjut pada pernyataan pertama dalam penangan penghentian.
Pernyataan goto
juga dapat melompat keluar dari bagian yang dijaga, tetapi menurunkan performa karena memanggil pelonggaran tumpukan. Pernyataan __leave
ini lebih efisien karena tidak menyebabkan stack unwinding.
Penghentian Abnormal
try-finally
Keluar dari pernyataan menggunakan fungsi run-time longjmp dianggap sebagai penghentian abnormal. Melompat ke pernyataan __try
dianggap tidak legal, tetapi melompat keluar darinya dianggap legal. Semua __finally
pernyataan yang aktif antara titik keberangkatan (penghentian __try
normal blok) dan tujuan ( __except
blok yang menangani pengecualian) harus dijalankan. Ini disebut pelepasan lokal.
__try
Jika blok dihentikan sebelum waktunya karena alasan apa pun, termasuk lompatan keluar dari blok, sistem menjalankan blok terkait __finally
sebagai bagian dari proses melepas tumpukan. Dalam kasus seperti itu AbnormalTermination
, fungsi mengembalikan true
jika dipanggil dari dalam __finally
blok; jika tidak, fungsi mengembalikan false
.
Handler penghentian tidak dipanggil jika proses dimatikan di tengah menjalankan try-finally
pernyataan.
END Microsoft-specific
Lihat juga
Menulis handler penghentian
Penanganan Pengecualian Terstruktur (C/C++)
Kata kunci
Sintaks penghentian-handler
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