Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;从“提高”;使用_Python_Python 3.x_Syntax_Exception Handling - Fatal编程技术网

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

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 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
期间,出现了不同的消息,用于标记错误处理中可能存在的错误。