防止失败的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代码>但是我还没有找到一种方法来解决这个问题。如果我没有在失败函数中终止程序,那么程序将在函数结束后终止。