3

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++ からこの機能を提供することを期待しています。

4

1 に答える 1

0

私の頭に浮かぶ最も簡単なことは、C++ ライブラリを Python モジュールでラップし、Python 関数で C++ 関数をラップすることです。すべての python 関数が c++ の代わりに python モジュールを呼び出すように、c モジュール名を python モジュールと交換する必要があります。

mv my_cmodule_name.so -> __my_cmodule_name.so (コード内の name も変更)

#my_cmodule_name.py

import my_cmodule_name as cmod
import traceback

def catchBadArgsDecorator(function):
    def _inner(*args,**kwds):
        try:
          return function(*args, **kdws)
        except ValueError:
          _, line, function, _ = traceback.extract_stack()[-1]
         log("Call to %s(%s) from %s@%d failed" % ( function.__name__, str(args), function,line)
    return _inner

# for all your modules functions
myfunction = catchBadArgsDecorator(cmod.myfunction)

コードはテストされておらず、改善される可能性がありますが、理解していただければ幸いです。

于 2010-04-17T20:03:15.073 に答える