try/catch
以下のコードでは、python モジュールコードで使用しています。ブロックにtry
単純なエラー (メモリ アクセス違反) があり、対応する例外をキャッチして、.stackdump
ファイルを生成せずにプログラムを静かに終了しようとしています。ただし、後者はまだ生成されており、try/catch
コンストラクトがその仕事をしていないことを意味します。不適切な操作 (コード内の操作など) が発生した場合に、ファイルの生成を回避.stackdump
し、エラーなしでプログラムを終了するにはどうすればよいですか? PS私はgccとboost.pythonを使ってcygwinでコードをコンパイルしています
x[3]=2
の場合にのみ機能するのではなく、他のすべての場合に機能x[4]=2
するのは興味深いことx[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 ブロックで囲みます (シグナル関数はクラス コンストラクターに配置されます)。
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)
したがって、例外がスローされますが、キャッチされる前にすべてが終了します。プロセスを終了する前にキャッチする方法はありますか?