Rumah > Artikel > pembangunan bahagian belakang > Bilakah Anda Harus Menggunakan __try Daripada cuba/tangkap/akhirnya dalam C ?
Pengecualian dalam C : __try vs. try/catch/finally
Dalam C , binaan try/catch/finally digunakan untuk mengendalikan pengecualian. Walau bagaimanapun, mereka juga boleh ditemui dengan garis bawah, seperti __try. Ini menimbulkan persoalan bila garis bawah ini diperlukan.
Pada Platform Windows: Menyatukan Pengendalian Pengecualian
Pada Windows, pengecualian disokong pada peringkat sistem pengendalian melalui Pengecualian Berstruktur Pengendalian (SEH). Ia setanding dengan isyarat Unix. Pengkompil yang menyasarkan Windows memanfaatkan SEH untuk melaksanakan pengecualian C.
Bukan Standard __cuba dan __kecuali
Untuk mengendalikan pengecualian SEH dalam C , anda mesti menggunakan kata kunci bukan standard __try bukannya mencuba. Kata kunci __except adalah serupa dengan tangkapan C, tetapi ia menyediakan fungsi tambahan. Ia membolehkan anda menentukan ungkapan penapis pengecualian yang menentukan sama ada pengecualian aktif harus ditangkap.
__akhirnya untuk Pelaksanaan Kod Selepas Pengecualian
Kata kunci __finally membolehkan anda untuk laksanakan kod selepas pengecualian telah dikendalikan. Ciri ini tidak terdapat dalam standard C , tetapi ia biasa dalam bahasa lain.
Melumpuhkan Pengoptimuman untuk Invocation Pemusnah
Pengkompil Microsoft melakukan pengoptimuman yang boleh menghalang pemusnah daripada digunakan dalam semua kes semasa tindanan melonggarkan. Jika ia menentukan bahawa tiada lontaran dalam skop yang mengawal seumur hidup objek, ia melangkau kod pendaftaran. Untuk memastikan seruan pemusnah, gunakan pilihan kompilasi /EHa untuk menyekat pengoptimuman ini.
Contoh Menunjukkan Pengendalian Pengecualian SEH dan C
Untuk menggambarkan konsep, berikut ialah coretan kod yang menunjukkan cara pengecualian SEH membenarkan seruan pemusnah C dan cara pengecualian C dibina di atas SEH:
#include <iostream> class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
Output:
Filtering c0000005 destructed caught Filtering e06d7363 destructed caught
Contoh ini mempamerkan pengendalian kedua-dua pengecualian SEH dan C, menunjukkan cara pemusnah digunakan walaupun semasa pengecualian SEH.
Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan __try Daripada cuba/tangkap/akhirnya dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!