Python 希望我的代码引发特定类型或错误,但打印原始错误
所以假设我有一些引起任何类型或错误的代码。我想让我的代码生成一个断言错误,但打印出的原始消息将与原始错误一起打印。我该怎么做 (示例) 原始错误: TypeError:'str'和'int'的实例之间不支持'>'Python 希望我的代码引发特定类型或错误,但打印原始错误,python,python-3.x,error-handling,Python,Python 3.x,Error Handling,所以假设我有一些引起任何类型或错误的代码。我想让我的代码生成一个断言错误,但打印出的原始消息将与原始错误一起打印。我该怎么做 (示例) 原始错误: TypeError:'str'和'int'的实例之间不支持'>' 自定义错误:AssertionError:exception=TypeError:“>”在“str”和“int”的实例之间不受支持。您必须捕获引发的异常,然后引发所需的类型。由于您提到要捕获任何类型的错误,因此必须使用Exception类作为捕获对象 然而,我要指出的是,这通常是一种不
自定义错误:AssertionError:exception=TypeError:“>”在“str”和“int”的实例之间不受支持。您必须捕获引发的异常,然后引发所需的类型。由于您提到要捕获任何类型的错误,因此必须使用
Exception
类作为捕获对象
然而,我要指出的是,这通常是一种不好的做法,因为您通常只希望捕获预期会出现的特定错误。但如果你最终抛出了一个错误,我想这并不可怕。但也让我想知道这段代码的具体目标是什么。无论如何
抓住任何东西
尝试…例外情况除外,如e
引发首选错误
raise AssertionError()
获取信息
e.message
获取类型
类型(e)
将所有内容放在一起:
试试看:
#引发错误的某些代码
g=10+‘11’
例外情况除外,如e:
引发断言错误(“{}:{}.”格式(类型(e),e.message))
产出将是:
<type 'exceptions.TypeError'>: unsupported operand type(s) for +: 'int' and 'str'
:不支持+:'int'和'str'的操作数类型
可以对其进行清理,以消除
类型(e)
的丑陋输出,但通常情况下,这是包含错误类型及其相应消息的方式。此外,您还可以通过设置\uu suppress\u context\uu=True来隐藏原始回溯,并进行一些格式设置,以满足预期输出的需要:
try:
a = '1' > 1
except Exception as exc:
assertion_exc = AssertionError('exception = {}: {}'.format(type(exc).__name__, str(exc)))
assertion_exc.__suppress_context__ = True # comment this line to see full traceback
raise assertion_exc
全输出:
Traceback (most recent call last):
File "./file.py", line 8, in <module>
raise assertion_exc
AssertionError: exception = TypeError: '>' not supported between instances of 'str' and 'int'
回溯(最近一次呼叫最后一次):
文件“/File.py”,第8行,在
提出主张(exc)
AssertionError:exception=TypeError:“>”在“str”和“int”的实例之间不受支持
您正在寻找(在Python 3中引入的),它允许您将特定于应用程序的异常包装在基本异常周围。
以下是一个例子:
>>> try:
... 1 > '1'
... except TypeError as e:
... raise AssertionError() from e
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: '>' not supported between instances of 'int' and 'str'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
AssertionError
>>试试:
... 1 > '1'
... 除类型错误为e外:
... 从e中引发AssertionError()
...
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
TypeError:“int”和“str”实例之间不支持“>”
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“”,第4行,在
断言错误
创建新异常时,可以提供包含诊断消息的字符串。
最好定义自己的特定于应用程序的异常,而不是循环使用AssertionError。
如果定义了多个,则将其中一个设置为[grand]父级,并使其他异常继承自该祖先。
这允许调用方方便地捕获细粒度或粗粒度的错误类
有一个描述了进一步考虑的问题。谢谢,您的回答很有帮助,但我也想知道最初的错误类型是什么。这里,原来的是一个类型错误,那么我怎么知道呢?哦,是的,你可以使用type(e)
来访问它。我将对答案进行编辑,将其包括在内。另外@J_H有一个更干净的解决方案。我相信功能是特定于Python3的,但这是您标记的版本,因此我将继续使用它,我希望我的异常更加通用。在我的示例中,TypeError只是一种可能的错误类型的示例。那么,我怎样才能包含任何类型的错误呢?异常除外
将捕获任何错误。更新了我的答案。