当前位置: 首页 > 面试题库 >

如何获取Python异常文本

寿翰飞
2023-03-14
问题内容

我想在我的C ++应用程序中嵌入python。我正在使用Boost库-很棒的工具。但是我有一个问题。

如果python函数引发异常,我想捕获它并在我的应用程序中打印错误,或者获取一些详细信息,例如导致错误的python脚本中的行号。

我该怎么做?我找不到任何函数来获取Python API或Boost中的详细异常信息。

try {
module=import("MyModule"); //this line will throw excetion if MyModule contains an   error
} catch ( error_already_set const & ) {
//Here i can said that i have error, but i cant determine what caused an error
std::cout << "error!" << std::endl;
}

PyErr_Print()只是将错误文本打印到stderr并清除错误,因此无法解决


问题答案:

好吧,我知道了怎么做。

没有boost(仅错误消息,因为从追溯中提取信息的代码太重,无法在此处发布):

PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
//pvalue contains error message
//ptraceback contains stack snapshot and many other information
//(see python traceback structure)

//Get error message
char *pStrErrorMessage = PyString_AsString(pvalue);

和BOOST版本

try{
//some code that throws an error
}catch(error_already_set &){

    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch(&ptype, &pvalue, &ptraceback);

    handle<> hType(ptype);
    object extype(hType);
    handle<> hTraceback(ptraceback);
    object traceback(hTraceback);

    //Extract error message
    string strErrorMessage = extract<string>(pvalue);

    //Extract line number (top entry of call stack)
    // if you want to extract another levels of call stack
    // also process traceback.attr("tb_next") recurently
    long lineno = extract<long> (traceback.attr("tb_lineno"));
    string filename = extract<string>(traceback.attr("tb_frame").attr("f_code").attr("co_filename"));
    string funcname = extract<string>(traceback.attr("tb_frame").attr("f_code").attr("co_name"));
... //cleanup here


 类似资料:
  • 问题内容: 从Python标准库的组件中获取异常消息的最佳方法是什么? 我注意到在某些情况下,您可以通过如下字段获取它: 但在某些情况下(例如在套接字错误的情况下),您必须执行以下操作: 我想知道是否有标准方法可以涵盖大多数情况? 问题答案: 如果查看内置错误的文档,则会看到大多数类将其第一个参数分配为属性。并非所有人都这样做。 值得注意的是,(与子类和)具有的第一自变量,第二的。没有…大致类似于

  • 问题内容: 如何获得在Python中引发的异常的名称? 例如, 例如,我正在捕获多个(或所有)异常,并想在错误消息中打印异常的名称。 问题答案: 以下是获取异常类名称的几种不同方法: 例如,

  • 在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc_info 方法; 使用 traceback 模块中的相关函数。 本节首先介绍如何使用 sys 模块中的 exc_info() 方法获得更多的异常信息。 有关 sys 模块更详细的介绍,可阅读《Python sy

  • 问题内容: 我在应用程序上加载一堆图像时遇到错误,我不确定是什么原因引起的。 这是他得到的错误。线135在底部。 我认为他的手机内存不足。他使用的是2010年生产的Desire HD。此方法的作用是从服务器获取图像并将其保存在哈希图中。以及将其显示在屏幕上。关于如何防止OUTMEMORYERROR的任何想法? 我当时正在考虑建立一个计数器,如果有超过20张图像,该计数器只会清除哈希图。 Logca

  • 问题内容: 我正在执行spring的简单Dependency Injection程序并获取此异常。我已经包含了common-logging1.1.1.jar和spring.jar文件。你能帮忙吗? 问题答案: 如果你正在使用maven来管理依赖项,请在中添加以下行:

  • 问题内容: 我正在尝试从Python内部进行比特币付款。在bash中,我通常会这样做: 因此,例如: 如果成功,我会得到一个交易ID作为输出,但是如果我尝试转账大于我的比特币余额的金额,则会得到以下输出: 现在,在我的Python程序中,我尝试按以下方式进行付款: 如果有足够的余额,则可以正常工作,但是如果没有足够的余额,则会输出以下内容: 它不包括我在命令行中得到的错误。所以我的问题是;如何从P