Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menentukan sumber pengecualian yang tidak dikendalikan dalam kod saya?

Bagaimanakah saya boleh menentukan sumber pengecualian yang tidak dikendalikan dalam kod saya?

Patricia Arquette
Patricia Arquetteasal
2024-11-16 15:33:03402semak imbas

How can I pinpoint the source of unhandled exceptions in my code?

Mengenal pasti Sumber Pengecualian Tidak Terkendali

Dalam bidang pengendalian pengecualian, keupayaan untuk menentukan punca pengecualian adalah yang paling penting. Walaupun agak mudah untuk memasukkan maklumat tambahan semasa membuat pengecualian, menentukan baris kod yang tepat di mana pengecualian tidak terkendali atau luaran berasal boleh mencabar.

Kelas Tersuai dan Makro untuk Penyelamat

Satu penyelesaian yang berkesan terletak pada penggunaan kelas pengecualian tersuai dan makro. Kita boleh menentukan kelas pengecualian tersuai, my_exception, yang memanjangkan standard std::runtime_error. Dalam kelas ini, kami memulakan mesej dengan nama fail pengecualian, nombor baris dan mesej ralat asal.

Seterusnya, kami mencipta makro, throw_line(), yang mengambil hujah dan melontar my_exception dengan yang sesuai maklumat. Makro ini memudahkan proses melontar pengecualian yang merangkumi konteks ralat terperinci.

Demonstrasi:

Mari kita pertimbangkan contoh kod berikut:

#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>

class my_exception : public std::runtime_error {
    std::string msg;
public:
    my_exception(const std::string &arg, const char *file, int line) :
    std::runtime_error(arg) {
        std::ostringstream o;
        o << file << ":" << line << ": " << arg;
        msg = o.str();
    }
    ~my_exception() throw() {}
    const char *what() const throw() {
        return msg.c_str();
    }
};
#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);

void f() {
    throw_line("Oh no!");
}

int main() {
    try {
        f();
    }
    catch (const std::runtime_error &ex) {
        std::cout << ex.what() << std::endl;
    }
}

Apabila menjalankan kod ini, outputnya ialah:

myFile.cpp:20: Oh no!

Seperti yang anda lihat, ia menyediakan mesej ralat terperinci yang merangkumi nama fail yang tepat, nombor baris dan hujah pengecualian. Maklumat ini sangat memudahkan penyahpepijatan dan membolehkan analisis punca yang cekap.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menentukan sumber pengecualian yang tidak dikendalikan dalam kod saya?. 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