当我提出自己的异常作为响应时,如何更轻松地抑制以前的异常?

Posted

技术标签:

【中文标题】当我提出自己的异常作为响应时,如何更轻松地抑制以前的异常?【英文标题】:How can I more easily suppress previous exceptions when I raise my own exception in response? 【发布时间】:2013-06-10 02:26:00 【问题描述】:

考虑

try:
   import someProprietaryModule
except ImportError:
   raise ImportError('It appears that <someProprietaryModule> is not installed...')

运行时,如果 someProprietaryModule 没有安装,会看到:

(traceback data)
ImportError: unknown module: someProprietaryModule

During handling of the above exception, another exception occurred:

(traceback data)
ImportError: It appears that <someProprietaryModule> is not installed...

也许我不希望出现“在处理上述异常期间...”行(以及它上面的行)。我可以这样做:

_moduleInstalled = True
try:
   import someProprietaryModule
except ImportError:
   _moduleInstalled = False
if not _moduleInstalled: 
   raise ImportError('It appears that <someProprietaryModule> is not installed...')

但这感觉有点像 hack。我还能做什么?

【问题讨论】:

这可能有助于***.com/questions/1319615/… 【参考方案1】:

在 Python 3.3 及更高版本中,raise ... from None 可用于这种情况。

try:
   import someProprietaryModule
except ImportError:
   raise ImportError('It appears that <someProprietaryModule> is not installed...') from None

这有预期的结果。

【讨论】:

正要发布同样的内容。另请参阅PEP3134。 PEP 409 是添加了from None 语法的内容。【参考方案2】:

这可以在 Python 2.7 和 Python 3 中像这样完成:

try:
    import someProprietaryModule
except ImportError as e:
    raised_error = e

if isinstance(raised_error, ImportError):
    raise ImportError('It appears that <someProprietaryModule> is not installed...')

【讨论】:

【参考方案3】:

你也可以试试logging 模块

import logging

try:
    import someProprietaryModule
    
except Exception as e:
    
    if hasattr(e, 'message'):
        logging.warning('python2')
        logging.error(e.message)
        
    else:
        
        logging.warning('python3')
        logging.error('It appears that <someProprietaryModule> is not installed...')

给予

WARNING:root:python3
ERROR:root:It appears that <someProprietaryModule> is not installed...

[Program finished]

【讨论】:

以上是关于当我提出自己的异常作为响应时,如何更轻松地抑制以前的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定地抑制 Python 中的 DeprecationWarning?

当我收到服务器协议冲突异常时,如何获得响应?

Beats:使用 Filebeat 中的 filestream 输入更快速更轻松地读取活动日志文件

Beats:使用 Filebeat 中的 filestream 输入更快速更轻松地读取活动日志文件

如何使用音频文件作为输入实现单边带抑制载波调制?

如何抑制 yfinance 的异常?