Dalam pengaturcaraan, situasi luar biasa sering berlaku, mencetuskan pengecualian yang mengganggu aliran biasa pelaksanaan. Walaupun secara amnya mudah untuk menentukan sumber pengecualian yang anda jana dengan sengaja, menjejak asal-usul pengecualian yang tidak dikendalikan atau yang dijana oleh sistem luaran boleh menjadi mencabar.
Satu pendekatan adalah bergantung pada maklumat terbina dalam pengecualian itu, yang mungkin termasuk penunjuk ke baris dan fail sumber yang bertanggungjawab untuk ralat. Walau bagaimanapun, maklumat ini tidak selalu tersedia atau boleh dipercayai dalam semua senario.
Untuk menangani had ini, pertimbangkan untuk menggunakan kelas pengecualian tersuai yang merangkumi kedua-dua pengecualian asal dan maklumat sumber. Ini membolehkan anda mengendalikan pengecualian dengan cara yang komprehensif dan mesra pengguna, memberikan butiran tepat tentang asal usulnya.
Begini cara untuk melaksanakan kelas pengecualian tersuai sedemikian:
#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(); } };
Setelah tersuai anda kelas pengecualian telah disediakan, anda boleh menggunakan makro untuk membuang pengecualian dengan maklumat sumber:
#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);
Makro ini boleh digunakan seperti berikut:
void f() { throw_line("Oh no!"); }
Apabila pengecualian dicetuskan menggunakan makro ini, kelas my_exception akan menyimpan maklumat sumber secara automatik, termasuk nama fail dan nombor baris.
Sekarang, mari kita tunjukkan cara mengendalikan pengecualian menggunakan kelas tersuai ini:
int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
Oleh menggunakan fungsi what() kelas pengecualian tersuai, anda boleh mendapatkan mesej ralat terperinci yang merangkumi maklumat sumber asal, membolehkan diagnosis dan penyelesaian ralat yang tepat.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengenalpasti Sumber Tepat Pengecualian Tidak Terkendali dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!