Bagikan melalui


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:

  1. Penangan penghentian dipanggil.

  2. Ketika penangan penghentian selesai, eksekusi berlanjut setelah pernyataan __finally. Namun bagian yang dijaga berakhir (misalnya, melalui goto isi yang dijaga atau return 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 urutan eksekusi handler penghentian.

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, , _finallydan _leave merupakan sinonim untuk __try, , __finallydan __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