0

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)

したがって、例外がスローされますが、キャッチされる前にすべてが終了します。プロセスを終了する前にキャッチする方法はありますか?

4

2 に答える 2

1

Linux では、デフォルトのアクションがcore( SIGABRTSIGSEGV、 ...) に設定されたシグナル ハンドラによってコア ダンプが生成されます。コア ダンプを回避したい場合は、これらのシグナルをいつでもキャプチャ/無視できます。Cygwin でも動作するはずstackdumpsです。ただし、出力として厄介なメッセージが表示される可能性があります。

編集:

#include <signal.h>

// [...]

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

int main(int argc, char* argv[]) {
    signal(SIGABRT, sig_action);
    signal(SIGSEGV, sig_action);

    Hello h("msg");
    h.run();
}
于 2013-03-24T22:32:08.227 に答える
1

スローされた例外のみをキャッチできます。無効なポインター アクセスは例外をスローしません。未定義の動作を引き起こすだけで、特定のケースではスタック ダンプが発生します。

このようなシチュエーションをキャッチしたい場合は、とアイテムにアクセスする機能std::vectorを使用してください。これは、無効なインデックスで使用するとスローされます。ただし、通常、このようなアクセスの可能性はアプリオリに回避することをお勧めします。これらは通常、プログラムのバグを示しており、バグは例外を介して処理すべきではなく、コードから削除する必要があるためです。atstd::out_of_range

于 2013-03-24T20:55:42.660 に答える