Python“;从“提高”;使用
Python中的Python“;从“提高”;使用,python,python-3.x,syntax,exception-handling,Python,Python 3.x,Syntax,Exception Handling,Python中的raise和raisefrom有什么区别 try: raise ValueError except Exception as e: raise IndexError 产生 Traceback (most recent call last): File "tmp.py", line 2, in <module> raise ValueError ValueError During handling of the above excepti
raise
和raisefrom
有什么区别
try:
raise ValueError
except Exception as e:
raise IndexError
产生
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError
IndexError
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError from e
IndexError
产生
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError
IndexError
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError from e
IndexError
回溯(最近一次呼叫最后一次):
文件“tmp.py”,第2行,在
升值误差
数值误差
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“tmp.py”,第4行,在
从e提升索引器
索引器
不同之处在于,当您使用from
时,设置了\uuuuuuuu原因
属性,并且消息指出异常是由直接导致的。如果从中省略了,则不会设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但也可以设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
如果在异常处理程序中使用了raise
,则会设置\uuuuuu上下文\uuuu
;如果您在其他任何地方使用了raise
,则也不会设置\uuuuuuuuuuuuu
如果设置了\uuuuuuuuuuuuuuuu原因
,则在异常上也设置了\uuuuuuuuuuuu抑制\uuuu上下文\uuuuuuu=True
标志;当\uuuu suppress\u context\uuu
设置为True
时,打印回溯时将忽略\uuuu context\uuu
当从不希望显示上下文的异常处理程序(不希望在处理另一个异常发生消息时显示上下文)引发时,请使用raise。。。从无
到设置\u抑制\u上下文
到为真
换句话说,Python为异常设置了一个上下文,这样您就可以内省引发异常的位置,让您查看是否有另一个异常被它取代。您还可以向异常添加原因,使回溯明确显示另一个异常(使用不同的措辞),并忽略上下文(但在调试时仍可以进行自省)。使用raise。。。从“无”
可以抑制正在打印的上下文
见:
from
子句用于异常链接:如果给定,第二个表达式必须是另一个异常类或实例,然后它将作为\uuuuuuuuuuuu原因
属性(可写)附加到引发的异常。如果未处理引发的异常,将打印两个异常:
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
另请参阅,以获取异常所附的上下文和原因信息的详细信息。您阅读了吗?现在请使用从无提升索引器,例如.Heh<代码>从False引发索引器
引发类型错误
,而不是索引器
。我的一天。相关:不确定这是否是正确的地方提到它,但对任何使用Spyder的人来说:整个构造在那里不起作用。这已经是一个3年多的问题了(),但他们似乎认为没有必要使用链接异常。是否有任何理由使用from
和\uuuuuuuuuu原因\uuuuuuuu
来显式链接异常,而不是隐式的上下文?是否存在附加与捕获的异常不同的异常的情况,除了
?@darkfeline:假设您的数据库API支持从各种来源打开数据库,包括web和磁盘。如果打开数据库失败,您的API将始终引发数据库错误。但是,如果失败是由于文件无法打开而导致的IOError
,或者是因为URL无法工作而导致的HTTPError
,那么这就是您希望明确包含的上下文,因此使用API的开发人员可以调试原因。此时,您使用从原始异常中引发DatabaseError
@darkfeline:如果开发人员正在将数据库API的使用包装到他们自己的API中,并希望将该IOError
或HTTPError
传递给他们的消费者,然后他们必须使用从databaseexception引发新异常。\uuuu原因\uuuuu
,现在使用与他们刚刚捕获的databaseexception
不同的异常。@dan3:不,没有。异常链接纯粹是Python3的一项功能。@laike9m:您的意思是当您处理异常foo
,并想引发一个新的异常bar
?然后,您可以使用从foo提升bar
,并使Python状态为foo
直接导致bar
。如果不使用foo
中的,则Python仍将同时打印这两个文件,但声明在处理foo
期间,出现了不同的消息,用于标记错误处理中可能存在的错误。