gpt4 book ai didi

c++ - 尝试/捕获以避免.stackdump

转载 作者:行者123 更新时间:2023-11-28 03:20:23 24 4
gpt4 key购买 nike

在下面的代码中,我在 python 模块代码中使用了 try/catch。在 try block 中,我有一个简单的错误(内存访问冲突)并试图捕获相应的异常并安静地终止程序而不生成 .stackdump 文件。然而,后者仍然会生成,这意味着 try/catch 结构没有完成它的工作。当遇到不当操作(如代码中的操作)时,我如何避免生成 .stackdump 文件并无错误地退出程序?附言我正在用 gcc 和 boost.python 在 cygwin 中编译代码

有趣的是,它不仅适用于 x[3]=2 情况,而且适用于所有其他情况:例如x[4]=2x[20]=2 或者,显然,x[2]=2

#include <boost/python.hpp>
#include <iostream>
#include <iomanip>
using namespace std;
using namespace boost::python;


class Hello
{
std::string _msg;

public:

Hello(std::string msg){_msg = msg;}

void run(){
try{

double* x;
x = new double[3];
x[3] = 2.0;
delete [] x;


}catch(...){ exit(0); }

}

};


BOOST_PYTHON_MODULE(xyz)
{
class_<Hello>("Hello", init<std::string>())
.def("run",&Hello::run)
;

}

编辑:

根据 Maciek 的建议,我尝试了以下技巧:

使信号处理函数抛出异常,但不退出

void sig_action(int signo) {
std::cout << "SIGNAL " << signo << std::endl;
throw 1;
// exit(0);
}

现在尝试在 try/catch block 中包含一个可能有问题的函数(信号函数放在类构造函数中):

class Hello
{
std::string _msg;

public:

Hello(std::string msg){
_msg = msg;
signal(SIGABRT, sig_action);
signal(SIGSEGV, sig_action);

}
void set(std::string msg) { this->_msg = msg; }
std::string greet() { return _msg; }

void run(){

try{
double* x;
x = new double[3];
x[3] = 2.0;
delete [] x;

}catch(...){ cout<<"error in function run()\n"; exit(0); }

}

};

但是这样的技巧并没有像我预期的那样工作,它产生了以下输出:

SIGNAL 6
terminate called after throwing an instance of 'int'
SIGNAL 6
terminate called recursively
SIGNAL 6
terminate called recursively
....
(and many more times the same)

所以异常被抛出,但一切都在它被捕获之前完成。有没有办法让它在终止进程前被捕获?

最佳答案

您只能捕获抛出的异常。无效的指针访问不会引发异常,它只会导致未定义的行为,在您的特定情况下,它会导致堆栈转储。

如果你想捕捉这种情况,使用std::vectorat function访问项目。当与无效索引一起使用时,这将抛出 std::out_of_range。但是,通常最好避免这种先验访问的可能性,因为它们通常表示您的程序中存在错误,错误不应通过异常处理,它们应该从代码中删除。

关于c++ - 尝试/捕获以避免.stackdump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com