python - 如何捕获使用 python subprocess.checkout() 调用调用的 C++ 程序中发生的异常?

标签 python c++ exception subprocess

我试图捕获在我使用 subprocess.checkout() 命令从 python 脚本调用的 c++ 程序中发生的异常,但它似乎没有按我的意图工作。虽然捕获了异常,但它没有关于异常原因的必要信息。我想打印出在 c++ 级别发生的异常跟踪(在下面的情况下是浮点异常或被零除错误)。我是 python 的新手,非常感谢这方面的任何帮助。谢谢。

下面是我用来调试这个问题的示例程序。

测试异常.cc

#include<iostream>
#include<exception>
#include <stdexcept>

using namespace std;
int main()
{
    int a=5;
    int b=0;
            try
            {   cout<< "I am a statement before division"<< endl;
                int c = a/b;
                cout<< "I am a statement after division"<< endl;
            }
            catch(exception &e)
            {
                cerr << "Cerr - To test exception \n" << endl;
            }

    return 0;
}

测试Python.py

import os
import socket
import subprocess
import sys
import traceback

print('Sample Python to simualte exception') 
TestOP = 'Default'

try:
    TestOP = subprocess.check_output(["/lhome/workspace/testException/testxptn"]) 
except subprocess.CalledProcessError as e :
    tb = traceback.format_exc()
    print(e)
    print(tb)
    print(e.output)

当前输出:

Sample Python to simualte exception
I am a statement before division
Traceback (most recent call last):
  File "TestPython.py", line 14, in <module>
    TestOP = subprocess.check_output(["/lhome/workspace/testException/testxptn"])
  File "/usr/lib/python2.7/subprocess.py", line 223, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
CalledProcessError: Command '['/lhome/workspace/testException/testxptn']' returned non-zero exit status -8

我想看到的输出或类似的东西

Sample Python to simualte exception
I am a statement before division
Floating point exception
Cerr - To test exception 

最佳答案

I am trying to catch an exception that occurs inside a c++

整数除以零不会产生 C++ 异常。在 Linux 上它会发出 SIGFPE 信号。

python3 更好地格式化subprocess.CalledProcessError异常:

Command '['/lhome/workspace/testException/testxptn']' died with <Signals.SIGFPE: 8>.

在 python2 中你可以这样做:

signo_to_string = dict((getattr(signal, s), s) for s in dir(signal) if s.startswith("SIG") and not s.startswith("SIG_"))

except subprocess.CalledProcessError as e:
    print(e)
    if os.WIFSIGNALED(e.returncode):
        print("Terminated by %s.\n" % signo_to_string[abs(e.returncode)])

关于python - 如何捕获使用 python subprocess.checkout() 调用调用的 C++ 程序中发生的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59103456/

相关文章:

python - 如何忽略 ~/.local/lib/python2.7/site-packages 中的 python 模块?

c++ - 将非全局 C++ 对象传递给 Lua 函数 (Swig)

c++ - GL_QUADS 绘制凹五边形而不是矩形

c++ - 从输入中导出最小的正则表达式

c# - 访问异常类数据属性中的字典项

Python:Dumbo 导入错误

python - 关于 collections.py 和 _abcoll.py (python 2.7.3) 中引导问题的代码注释

Python DictWriter 编写 UTF-8 编码的 CSV 文件

python - 在 python 中检索双重引发的异常原始堆栈跟踪

c# - 未处理的 C# 异常