Boost::Python を介して多くの Python 関数から呼び出される C++ 関数があります。C++ 関数が不正な引数を検出した場合、ログ メッセージを書き込んで処理を続行したいと考えています。そのログ メッセージには、C++ を呼び出した Python モジュールと行番号が記載されています。これどうやってするの?
C++ から例外をスローすることはできます。これは、キャッチできる Python 例外に変換されますが、それによって C++ 関数が中止されます。
たとえば、factorial() が 1 未満の数値を受け取った場合に警告メッセージをログに記録したいとします。ケースを簡単に処理できる (実際に処理する) という事実は無視してください。いずれにせよ、私の上司は警告を求めています。;)
このコードは、Python から直接呼び出すことも、Python から呼び出される他の C++ 関数から呼び出すこともできるため、C++ スタック トレース自体はあまり役に立ちません。
int factorial(int n) {
if (n < 1) {
logMsg("invalid n passed to factorial() at %s, line %d",
<python-module>, <python-line-number>);
}
return n <= 1 ? 1 : n * factorial(n - 1);
}
Boost::Python ライブラリが C++ からこの機能を提供することを期待しています。