Rumah >pembangunan bahagian belakang >C++ >Bilakah Anda Harus Menggunakan __try Daripada cuba/tangkap/akhirnya dalam C ?

Bilakah Anda Harus Menggunakan __try Daripada cuba/tangkap/akhirnya dalam C ?

DDD
DDDasal
2024-11-11 13:58:02527semak imbas

When Should You Use __try Instead of try/catch/finally in 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!

Kenyataan:
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