草庐IT

Python C API : how to get string representation of exception?

coder 2023-08-19 原文

如果我这样做(例如)

 open("/snafu/fnord")

在 Python 中(并且文件不存在),我得到一个回溯和消息

 IOError: [Errno 2] No such file or directory: '/snafu/fnord'

我想用 Python 的 C API(即嵌入在 C 程序中的 Python 解释器)获取上述字符串。我需要它作为一个字符串,而不是输出到控制台。

使用 PyErr_Fetch() 我可以获得异常的类型对象和值。对于上面的例子,值是一个元组:

 (2, 'No such file or directory', '/snafu/fnord')

从我从 PyErr_Fetch() 获得的信息到 Python 解释器显示的字符串,是否有一种简单的方法? (不涉及自己为每种异常类型构造此类字符串。)

最佳答案

我认为 Python 异常是通过在异常实例上运行“str()”来打印的,它将返回您感兴趣的格式化字符串。您可以通过调用 PyObject_Str() 从 C 中获取它。此处描述的方法:

https://docs.python.org/c-api/object.html

祝你好运!

更新: 我有点困惑为什么 PyErr_Fetch() 返回给您的第二个元素是一个字符串。我的猜测是您收到了一个“非规范化异常”并且需要调用 PyErr_NormalizeException() 将该元组转换为一个“真正的”异常,它可以将自身格式化为您想要的字符串。

关于Python C API : how to get string representation of exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1001216/

有关Python C API : how to get string representation of exception?的更多相关文章

  1. java - Jasypt 使用 Bouncy CaSTLe 的 EncryptionOperationNotPossibleException - 2

    我尝试使用Jasypt与BouncyCastlecrypro在Spring应用程序中提供(128位AES)来解密实体属性,同时使用Hibernate保存它们。但是当尝试保存实体时,我总是得到这个org.jasypt.exceptions.EncryptionOperationNotPossibleException。org.jasypt.exceptions.EncryptionOperationNotPossibleExceptionEncryptionraisedanexception.Apossiblecauseisyouareusingstrongencryptionalgor

  2. java - Tomcat 中的 org.jasypt.exceptions.EncryptionOperationNotPossibleException - 2

    我正在使用Jasypt加密库来加密/解密一些文本。此代码嵌入到WAR文件中并部署到服务器。在本地运行时,在单元测试中,加密/解密循环工作得很好。我使用Jetty来开发应用程序。该代码在该服务器中完美运行。出于某种原因,部署到Tomcat会中断它,但出现以下异常:仅供引用,我在本地和服务器环境中都安装了强大的加密库,并且我使用的是最新的1.6版本(补丁级别25)。org.jasypt.exceptions.EncryptionOperationNotPossibleException异常没有消息。代码是完全对称的。我把它贴在这里进行检查。以下是相关位:我找到一个oldNabblepost

  3. android - 使用 "One account per email address"时出现 FirebaseAuthInvalidCredentialsException - 2

    ...ifyoudon'tallowmultipleaccountswiththesameemailaddress,ausercannotcreateanewaccountthatsignsinusingaGoogleAccountwiththeemailaddressex@gmail.comiftherealreadyisanaccountthatsignsinusingtheemailaddressex@gmail.comandapassword.我能够使用已通过电子邮件提供商注册的同一电子邮件登录Google提供商,因此Google提供商替换了电子邮件提供商,后者随后无法登录Fi

  4. java - Springframework.dao.InvalidDataAccessResourceUsageException hibernate .SQLGrammarException MySQLSyntaxErrorException - 2

    我正在努力寻找这里出了什么问题。我正在处理一个模式:它有一个Story实体(表:故事),我正在尝试向这个stories.portofoliotype_id添加一列,这是一个外国PortfolioType(表:portofoliotypes)的键。我想我的注释是正确的,我什至记录了MySQL查询,它得到以下查询,这是正确的。我正在尝试创建一个新故事:插入故事(backlog_id,描述,iteration_id,名称,parent_id,portfoliotype_id,state,storyPoints,storyValue,treeRank)值(11,null,null,“调试故事”

随机推荐