Python中传入0、1、2调用open函数为何未触发异常?
问题解答
代码复现
def abrir_archivo(nombre_archivo): try: archivo = open(nombre_archivo, 'r') except FileNotFoundError: print("El archivo no fue encontrado") except: print("Error desconocido") else: print("Abriendo exitosamente") finally: print("Finalizando ejecucion") abrir_archivo(1)
疑问点
运行上述程序时,传入0、1、2作为参数调用abrir_archivo函数,会执行else分支并打印"Abriendo exitosamente";但传入3、-1或其他数字时,会打印"Error desconocido"。按预期传入数字应该触发异常,为何0、1、2不会触发?
原因解析
- Python的
open()函数不仅能接收字符串类型的文件名,还能接收整数类型的文件描述符。 - 系统在程序启动时,会默认打开三个标准流对应的文件描述符:
- 0:对应标准输入(stdin),比如键盘输入流
- 1:对应标准输出(stdout),比如控制台输出流
- 2:对应标准错误(stderr),比如错误信息输出流
- 这三个文件描述符是系统预先分配并处于打开状态的,所以用0、1、2调用
open()时,不会触发文件找不到的异常,也不会触发其他错误,因此代码会顺利执行else分支。 - 而3、-1这类数字不是系统默认维护的有效文件描述符,用它们调用
open()会触发OSError(具体为无效文件描述符的错误),这个异常不属于FileNotFoundError,所以会被第二个通用except捕获,打印"Error desconocido"。
内容的提问来源于stack exchange,提问作者David Chambilla
相关产品推荐
相关产品推荐

