Bagaimanakah Pengendalian Pengecualian Berstruktur (SEH) Berfungsi dalam C dengan __cuba dan cuba/tangkap/akhirnya?

Barbara Streisand
Lepaskan: 2024-11-07 13:11:03
asal
316 orang telah melayarinya

How Does Structured Exception Handling (SEH) Work in C   with __try and try/catch/finally?

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!