Menentukan Asal Pengecualian Tidak Terkendali
Dalam pengendalian pengecualian, adalah perkara biasa untuk memasukkan nombor baris dan nama fail sumber untuk menentukan punca pengecualian. Apabila pengecualian dijana secara manual, maklumat ini boleh ditambah dengan mudah. Walau bagaimanapun, pengecualian yang tidak dikendalikan dan pengecualian yang tidak dilemparkan secara eksplisit mungkin menimbulkan cabaran.
Menggunakan Kelas Pengecualian Tersuai dengan Makro
Untuk mengatasi had ini, penyelesaian yang lebih mantap ialah dengan menggunakan kelas pengecualian tersuai dan makro. Kod C berikut menggambarkan cara ia boleh dicapai:
#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__);
Contoh Penggunaan
Dengan kelas pengecualian tersuai dan makro di tempatnya, pengecualian yang tidak dikendalikan boleh ditangkap dan sumber mereka ditunjuk:
void f() { throw_line("Oh no!"); } int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
Apabila kod ini dilaksanakan, mesej ralat berikut ialah dicetak:
myFile.cpp:255: Oh no!
Ini dengan jelas mengenal pasti fail dan nombor baris tempat pengecualian dilemparkan, memberikan maklumat berharga untuk nyahpepijat dan menyelesaikan isu.
Atas ialah kandungan terperinci Bagaimana untuk Menentukan Asal Pengecualian Tidak Terkendali dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!