这里我假设别人的屎山代码封装成了一个函数。
实际学习工作时很多人会扔给你屎山代码。可能其中不对长度做校验,可能其中有bug。这是很常见的。而你的老师或者老板往往只要结果,只要你跑起来代码 别的不管。
我们只想在循环里能够把代码跑起来 忽略掉报错的几次。尤其是段错误。
由于段错误等是系统级别调用,往往会直接关掉你这个主进程。try catch无法捕捉异常来继续下一个循环。
我们使用信号量。因为当你程序发生异常 实则是操作系统给了你程序一个异常的信号量,让你程序赶紧终止。
我们捕获这次异常信号, 不让程序退出,跳转进行下一次循环。
// 如何运行c、c++屎山代码
#include <iostream>
#include <csignal>
#include <setjmp.h>
#include <iostream>
using namespace std;
jmp_buf env;
//信号量
// 信号处理程序
void signalHandler(int signum) {
std::cout << "Caught signal " << signum << ", continuing to next iteration...\n";
// 跳转到下一次迭代
longjmp(env, 1);
}
//屎山代码
void riskyFunction() {
int *ptr = nullptr;
// 这将导致段错误
*ptr = 42;
}
int main() {
// 注册信号处理程序
signal(SIGSEGV, signalHandler);
for (int i = 0; i < 10; ++i) {
cout <<"第"<<i <<"次"<<endl;
if (setjmp(env) == 0) {
std::cout << "Iteration " << i << std::endl;
try {
riskyFunction();
} catch (...) {
std::cout << "Exception caught, but this should not happen for SIGSEGV" << std::endl;
}
} else {
// 从 signalHandler 中跳回来,直接继续下一个迭代
std::cout << "Recovered from segment fault in iteration " << i << std::endl;
//做一些恢复
}
}
std::cout << "Program finished." << std::endl;
return 0;
}
最后再说一点,其实我就是在模拟try - final的结构。java这种高级语言都有try final。但是c++没有。。。