例如,我使用了"with"语句,并且我在"with"中做了一些可以抛出异常的操作,我希望捕获该异常,这样我就可以使用sys.exit(0)/sys.exit(1),这样调用脚本/shell 就可以获取通过/失败的结果.

with open("test.txt", "r") as f:
    try:
        do_something_with(f)
    except Exception as e:
        sys.exit(1)
    else:
        sys.exit(0)

在我的例子中,我打开的不是文件,而是到服务器的连接,我只想知道上下文管理器的__exit__是否会被正确调用,或者sys.exit()是否会以某种方式绕过它?

推荐答案

是,上下文管理器的__exit__仍将被调用.

您可以通过创建自己的虚拟上下文管理器来亲自测试这一点:

import contextlib
import sys


@contextlib.contextmanager
def my_context_manager():
    try:
        print("enter")
        yield
    finally:
        print("exit")


with my_context_manager():
    print("inside")
    sys.exit(1)

运行此脚本输出

enter
inside
exit

这应该是有意义的,因为sys.exit通过提升SystemExit来工作,这只是一个稍微特殊的例外,不是从Exception继承的.堆栈展开的发生方式与任何其他异常相同.如果你喜欢,你甚至可以捕捉到它:

try:
    sys.exit(1)
except SystemExit:
    print("caught exit")

print("I survived sys.exit()!")

输出

caught exit
I survived sys.exit()!

Python-3.x相关问答推荐

根据收件箱内部的值以行降序的特定顺序重新排序列

如何匹配字母,数字,短划线,逗号,但不是如果没有数字和字母?

确定字符串的长度并提取前15或14个字符

Pandas :从元组字典创建数据帧

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

tkinter treeview 如何在获取所选项目时将设置的对象作为对象返回

将值从函数传递到标签

它们是否同样存储在python3的内存中?

Python.在循环中填充字典的问题

RGB 图像中最主要的 colored颜色 - OpenCV / NumPy / Python

创建一个可旋转的 3D 地球

在带有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败

如何为 Python 中的线程设置异步事件循环?

Python 3 变量名中接受哪些 Unicode 符号?

Python 解包运算符 (*)

如何使用 asyncio 添加连接超时?

判断 dict.items() 中的成员资格的时间复杂度是多少?

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

Python 3 中的连接列表

有没有办法在多个线程中使用 asyncio.Queue ?