【发布时间】:2019-06-04 10:20:25
【问题描述】:
我有一个使用 pybind11 的带有 c++ 代码的 python 模块,该模块已导入到我的 django + celery 3.1.25 应用程序中。 C++ 代码包含可能在 celery worker 内部触发的断言,然后导致WorkerLostError。
我已经尝试将调用 python c++ 模块放在 try: except: 范围内,但这不起作用并且 celery worker 仍然崩溃。
我还尝试在我的 apply_async 调用中使用 link_error= 参数绑定错误回调函数到我的 celery 任务,但是该方法永远不会被调用。
理想情况下,我想以某种方式捕获错误,以便向用户显示错误消息。任何建议表示赞赏!
【问题讨论】:
-
澄清一下:C++ 模块是你自己的吗?你能修改它的源代码吗?你能从源代码编译它吗?
-
是的,我可以修改 c++ 源代码,但我将断言放在那里以捕获意外错误。
-
断言的使用应该仅限于调试。对于您的生产版本,我将在禁用断言的情况下进行编译。您可能想抛出exception 而不是使用断言,但通常您应该保存断言以检查程序的内部逻辑并使用异常来表示违反合同。
-
是的,有道理,但是这些断言确实是为了程序的内部逻辑,比如写出数组的边界等等。
-
它们仍应启用。无论如何,保留用于单元测试和开发构建的断言。但在生产中,它们应该被禁用。
标签: python c++ django celery pybind11