Python 希望我的代码引发特定类型或错误,但打印原始错误

Python 希望我的代码引发特定类型或错误,但打印原始错误,python,python-3.x,error-handling,Python,Python 3.x,Error Handling,所以假设我有一些引起任何类型或错误的代码。我想让我的代码生成一个断言错误,但打印出的原始消息将与原始错误一起打印。我该怎么做 (示例) 原始错误: TypeError:'str'和'int'的实例之间不支持'>' 自定义错误:AssertionError:exception=TypeError:“>”在“str”和“int”的实例之间不受支持。您必须捕获引发的异常,然后引发所需的类型。由于您提到要捕获任何类型的错误,因此必须使用Exception类作为捕获对象 然而,我要指出的是,这通常是一种不

所以假设我有一些引起任何类型或错误的代码。我想让我的代码生成一个断言错误,但打印出的原始消息将与原始错误一起打印。我该怎么做

(示例)

原始错误: TypeError:'str'和'int'的实例之间不支持'>'


自定义错误: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只是一种可能的错误类型的示例。那么,我怎样才能包含任何类型的错误呢?
异常除外
将捕获任何错误。更新了我的答案。