在编程中,经常会出现异常情况,触发异常,扰乱正常的执行流程。虽然查明您故意生成的异常的来源通常很简单,但追踪未处理的异常或外部系统生成的异常的来源可能具有挑战性。
一种方法是依赖异常的内置信息,其中可能包括指向导致错误的行和源文件的指针。但是,此信息并不总是在所有情况下可用或可靠。
要解决此限制,请考虑使用封装原始异常和源信息的自定义异常类。这使您能够以全面且用户友好的方式处理异常,并提供有关其起源的精确详细信息。
以下是如何实现此类自定义异常类:
#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!"); }
当使用触发异常时通过这个宏,my_exception类会自动存储源信息,包括文件名和行号。
现在,让我们演示如何使用这个自定义类处理异常:
int main() { try { f(); } catch (const std::runtime_error &ex) { std::cout << ex.what() << std::endl; } }
通过利用自定义异常类的what()函数,您可以获得详细的错误信息,其中包括原始来源信息,从而实现精确的错误诊断和解决。
以上是如何确定 C 中未处理异常的确切来源?的详细内容。更多信息请关注PHP中文网其他相关文章!