C++ 异常处理:从 setjmp/longjmp 到 C++ 异常
1. 认识 setjmp 异常
setjmp 异常可看作 C 风格的异常。与 C++ 风格的异常类似,它能让用户在代码中设置出错时返回的位置,并提供生成跳转异常的方法。
以下是一个示例代码:
#include <cstring> #include <csetjmp> #include <iostream> std::jmp_buf jb; void myfunc(int val) { if (val == 42) { errno = EINVAL; // Invalid argument std::longjmp(jb, -42); } } int main() { if (setjmp(jb) == -42) { std::cout << "failure: " << strerror(errno) << '\n'; std::exit(EXIT_FAILURE); } myfunc(1); std::cout << "success\n"; myfunc(42); std::cout << "success\n"; } // > g++ -std=c++17 scratchpad.cpp; ./a.out // success // failure: Invalid argument