Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 with语句表达式中引发的异常会发生什么情况?_Python_With Statement_Contextmanager - Fatal编程技术网

Python with语句表达式中引发的异常会发生什么情况?

Python with语句表达式中引发的异常会发生什么情况?,python,with-statement,contextmanager,Python,With Statement,Contextmanager,我对Python的with语句的理解如下: with语句=with+表达式+as+目标+:+suit 表达式被执行并返回上下文管理器 上下文管理器的\uuuuu enter\uuuu向目标返回一个值 该套件已执行 调用上下文管理器的\uuuuuuuuuuuuuuuuuu方法 我知道异常可以在步骤2和步骤3中处理,我的问题是,如果在执行表达式的步骤1期间抛出异常,我可以获得上下文管理器吗 如果不是,这是否意味着with语句只是确保诉讼得以正确执行和结束 与将open(“file”)作为f的类似,如

我对Python的
with
语句的理解如下:

with
语句=
with
+表达式+
as
+目标+
+suit

  • 表达式被执行并返回上下文管理器
  • 上下文管理器的
    \uuuuu enter\uuuu
    向目标返回一个值
  • 该套件已执行
  • 调用上下文管理器的
    \uuuuuuuuuuuuuuuuuu
    方法
  • 我知道异常可以在步骤2和步骤3中处理,我的问题是,如果在执行表达式的步骤1期间抛出异常,我可以获得上下文管理器吗

    如果不是,这是否意味着
    with
    语句只是确保诉讼得以正确执行和结束


    与将open(“file”)作为f的
    类似,如果文件不存在,会发生什么?

    带有
    语句的
    只管理步骤3中的异常。如果在步骤1(执行表达式)或步骤2(执行上下文管理器
    \uuuuu enter\uuuu
    方法)中引发异常,则您没有(有效且有效的)上下文管理器将异常传递给

    因此,如果文件不存在,则在步骤1中会引发异常,并且上下文管理器无法处理该异常,因为该上下文管理器从未创建过

    如果出现问题,则始终可以单独执行表达式部分:

    try:
        context_manager = expression
    except SomeSpecificException:
        # do something about the exception
    else:
        with context_manager as target:
            # execute the suite
    

    如果在
    \uuuu enter\uuuu
    (步骤2)中引发异常,则尚未输入上下文,因此将不会调用
    \uuuu exit\uuuu
    。在该步骤中处理异常的唯一选项是将整个
    with
    语句放入
    try…except
    块中

    你已经弄明白了;如果表达式引发异常,则不会有上下文管理器,因此,如果没有,则
    with
    语句无法处理该异常。