3

我有一个 C++ 函数,它通过 Boost::Python 从许多 Python 函数中调用。当 C++ 函数检测到错误参数时,我想写一条日志消息并继续处理。在该日志消息中,我想记下调用 C++ 的 Python 模块和行号。我怎样才能做到这一点?

我能够从 C++ 中抛出一个异常,该异常被翻译成我可以捕获的 Python 异常,但这会中止我无法拥有的 C++ 函数。

例如,假设我想在 factorial() 收到小于一的数字时记录一条警告消息。忽略它可以轻松处理此案(并且确实如此)的事实——我的老板无论如何都想要一个警告。;)

此代码可以直接从 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

我想到的最简单的事情是用 python 模块包装 c++ 库,并让 python 函数包装 c++ 函数。您必须将您的 c 模块名称与您的 python 模块交换,以便所有 python 函数都将调用 python 模块而不是 c++ 模块。

mv my_cmodule_name.so -> __my_cmodule_name.so (并在代码内部更改其名称)

#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 回答