防止失败的glog CHECK语句终止程序 我有一个C++库,它使用 GOLG CHECK/语句来在运行时为各种条件提供资产。如果检查失败,glog终止程序。我的Python程序需要从C++库中得到一些功能,所以我编写了一个简单的C包装器,用于编写这些函数,并编写了一个DLL,可以使用 cType 加载和使用。p>

防止失败的glog CHECK语句终止程序 我有一个C++库,它使用 GOLG CHECK/语句来在运行时为各种条件提供资产。如果检查失败,glog终止程序。我的Python程序需要从C++库中得到一些功能,所以我编写了一个简单的C包装器,用于编写这些函数,并编写了一个DLL,可以使用 cType 加载和使用。p>,python,c++,c,assert,glog,Python,C++,C,Assert,Glog,问题是,如果CHECK语句失败,python程序将立即中止,用户将丢失所有未保存的工作 相反,我希望将库中出现错误的情况作为python中的异常处理。C++库不是我编写的,改写它不是一个好的解决方案。如何防止我的Python程序在一个 GOLG 检查> /COD>语句从C++调用的库中失败时终止? < P>一个快速的解决方案是在一个单独的进程中运行函数。C++库中的函数很重(1秒),所以这是合理的。 最小Python 3示例: 导入ctypes 导入多处理 library=ctypes.cdl

问题是,如果
CHECK
语句失败,python程序将立即中止,用户将丢失所有未保存的工作


相反,我希望将库中出现错误的情况作为python中的异常处理。C++库不是我编写的,改写它不是一个好的解决方案。如何防止我的Python程序在一个<代码> GOLG <代码>检查> /COD>语句从C++调用的库中失败时终止?

< P>一个快速的解决方案是在一个单独的进程中运行函数。C++库中的函数很重(1秒),所以这是合理的。 最小Python 3示例:

导入ctypes
导入多处理
library=ctypes.cdll.LoadLibrary(…)
def运行函数(参数、队列):
queue.put(library.function(*params))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
参数=。。。
队列=多处理。队列()
p=multiprocessing.Process(target=RunFunction,args=(params,queue))
p、 开始()
p、 加入
如果p.exitcode==0:
打印(“函数返回:{}”。格式(queue.get())
其他:
打印(“非零退出代码:{}”。格式(p.exitcode))

快速解决方案是在单独的进程中运行该函数。C++库中的函数很重(1秒),所以这是合理的。 最小Python 3示例:

导入ctypes
导入多处理
library=ctypes.cdll.LoadLibrary(…)
def运行函数(参数、队列):
queue.put(library.function(*params))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
参数=。。。
队列=多处理。队列()
p=multiprocessing.Process(target=RunFunction,args=(params,queue))
p、 开始()
p、 加入
如果p.exitcode==0:
打印(“函数返回:{}”。格式(queue.get())
其他:
打印(“非零退出代码:{}”。格式(p.exitcode))

也许可以重新定义
检查
以引发Python异常并重建它?@tadman在
glog
中有许多变体,它们可能会触发相同的问题<代码>检查\u NOTNULL
检查\u STRCASENE
日志(致命的
日志(致命的
DLOG
PLOG
SYSLOG
,等等。从技术上来说,重新定义它们都是可能的,但这感觉过于复杂,维护起来也有问题。如果你的库中装满了可能爆炸的炸弹,那么实际上只有一种方法来处理它:进去并全部解除它们的武装。我不知道还能做什么使用
assert()发送代码
在非开发版本中进行类型调用是一件很棘手的事情。这些调用应该会返回错误或异常,因为代码就是这样工作的,这将使您的生活更加轻松。
glog
支持通过
InstallFailureFunction
调用自定义错误处理。@user58697我一直在玩
InstallFailureFunction但我还没有找到一种方法来使用它来解决这个问题。如果我不在失败函数中终止程序,那么程序将在函数结束后终止。也许重新定义
检查
以引发Python异常并重建它?@tadman在
glog
中有许多变体可以触发相同的异常问题。
检查NOTNULL
检查STRCASENE
日志(致命的
日志(致命的
DLOG
PLOG
SYSLOG
,等等。从技术上来说,重新定义它们都是可能的,但这感觉过于复杂,维护起来也有问题。如果你的库中装满了可能爆炸的炸弹,那么实际上只有一种方法来处理它:进去并全部解除它们的武装。我不知道还能做什么使用
assert()发送代码
在非开发版本中进行类型调用是一件很棘手的事情。这些调用应该会返回错误或异常,因为代码就是这样工作的,这将使您的生活更加轻松。
glog
支持通过
InstallFailureFunction
调用自定义错误处理。@user58697我一直在玩
InstallFailureFunction但是我还没有找到一种方法来解决这个问题。如果我没有在失败函数中终止程序,那么程序将在函数结束后终止。