Pengendalian Pengecualian Berstruktur (SEH) dalam C dengan __cuba dan cuba/tangkap/akhir sekali
Dalam C , cuba/tangkap/akhirnya menyekat menyediakan mekanisme untuk mengendalikan pengecualian dalam blok kod. Walau bagaimanapun, pada Windows, pengkompil juga menyokong pendekatan berbeza yang dipanggil Pengendalian Pengecualian Berstruktur (SEH).
Kata kunci __try ialah kata kunci bukan standard yang membolehkan anda menangkap pengecualian SEH. Pengecualian SEH disokong pada peringkat sistem pengendalian, menyediakan cara untuk menangkap pengecualian daripada sistem pengendalian itu sendiri atau daripada kod yang menggunakan SEH untuk pengendalian pengecualian.
Kata kunci __except membolehkan anda menentukan ungkapan penapis pengecualian yang menentukan sama ada atau bukan pengecualian aktif harus ditangkap. Ini membolehkan anda mengendalikan jenis pengecualian tertentu secara selektif.
Kata kunci __akhirnya membolehkan anda menambah kod yang dijalankan selepas pengecualian dikendalikan. Ini berguna untuk melakukan tindakan pembersihan, seperti mengosongkan sumber atau menutup fail.
Pengecualian SEH dilaksanakan di atas pengecualian C. Pengecualian C dilemparkan menggunakan kata kunci lontaran dan boleh ditangkap menggunakan kata kunci tangkapan. Apabila pengecualian C dilemparkan, pengkompil mencipta pengecualian SEH yang sepadan yang boleh ditangkap oleh blok __try/__kecuali.
Pilihan penyusunan EHa memaksa pengkompil untuk sentiasa menjana kod untuk mendaftarkan pemusnah objek yang dicipta dalam skop blok percubaan. Ini memastikan bahawa pemusnah dipanggil walaupun dengan adanya pengecualian SEH tak segerak.
Untuk menunjukkan cara pengecualian SEH boleh ditangkap dalam C , pertimbangkan program berikut:
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; }
Apabila anda menjalankan ini program dengan set pilihan penyusunan EHa, output akan menunjukkan bahawa pemusnah objek Contoh dipanggil, walaupun pengecualian SEH dinaikkan. Ini menunjukkan cara pengecualian SEH dan pengecualian C boleh dikendalikan bersama dalam kod C.
Atas ialah kandungan terperinci Bagaimanakah Pengendalian Pengecualian Berstruktur (SEH) Berfungsi dalam C dengan __cuba dan cuba/tangkap/akhirnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!