Bagaimanakah Saya Boleh Mengenalpasti Sumber Tepat Pengecualian Tidak Terkendali dalam C?

Patricia Arquette
Lepaskan: 2024-11-18 12:18:02
asal
747 orang telah melayarinya

How Can I Identify the Exact Source of Unhandled Exceptions in C  ?

Mengenal pasti Sumber Tepat Pengecualian Tidak Terkendali

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

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

Makro ini boleh digunakan seperti berikut:

void f() {
    throw_line("Oh no!");
}
Salin selepas log masuk

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

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!

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