微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在file.close上出现[Errno 9]错误的文件描述符-错误处理

如何解决为什么我在file.close上出现[Errno 9]错误的文件描述符-错误处理

我有以下代码

版本A

try:
    file = open(local_copy,"wt")
    n = file.write(str(soup))
    logging.debug(f'\t{local_copy} saved. {n} lines saved.')
except IOError as e:
    logging.error(traceback.print_exc())
finally:
    file.close()

B版

try:
    with open(local_copy,"wt") as file:
        n = file.write(str(soup))
    logging.debug(f'\t{local_copy} saved. {n} lines saved.')
except IOError as e:
    logging.error(traceback.print_exc())
finally:
    None

两个都失败,并显示[Errno 9]错误文件描述符。它是由异常处理程序在堆栈的上方进行填充的。

现在,我将True(布尔值)作为local_copy的值传递。我知道它会失败,但是我的目标是正确处理错误

我最终做了以下事情,但是找不到最佳解决方案。我想知道为什么最初的try ... catch块无法捕捉到这一点。有没有其他更好的方法来处理IOErrors

if not isinstance(local_copy,str):
    logging.error(f"Cannot store localcopy of the file")
    logging.error(f'"local_copy" variable holds a value of an incorrect type: {type(local_copy)} (required str).')
else:
    try:
        file = open(local_copy,"wt")
        n = file.write(str(soup))
        logging.debug(f'\t{local_copy} saved. {n} lines saved.')
        # with open(local_copy,"wt") as file:
        #     n = file.write(str(soup))
        # 
        # logging.debug(f'\t{local_copy} saved. {n} lines saved.')
    except IOError as e:
        logging.error(traceback.print_exc())
    finally:
        file.close()
        #None

OSError以及异常都不会捕获任何东西。

独立示例:

import io

local_copy = True
soup = "Great soup"

try:
    file = open(local_copy,"wt")
    n = file.write(str(soup))
    print(f'\t{local_copy} saved. {n} lines saved.')
except OSError as e:
    print("we got the error")
finally:
    file.close()
print ("Done")

输出

$ python3 test.py 
True saved. 10 lines saved.
Great soupTraceback (most recent call last):
 File "test.py",line 18,in <module>
    print ("Done")
OSError: [Errno 9] Bad file descriptor
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
OSError: [Errno 9] Bad file descriptor

为什么我会忽略异常? 另外,为什么汤的内容被发送到stdout?

解决方法

您的代码:

local_copy = True
....
file = open(local_copy,"wt")

根据值True创建一个文件对象,该值与整数1相同,整数open代表标准输出的文件描述符,即默认情况下所有打印输出消息的通道。

(通常print("Done") 与文件名一起使用-我猜您不打算写入标准输出。)

关闭该文件时,将关闭标准输出。此后的第一次打印将失败:

amazonlinux2-x86_64-standard:3.0

因为它无法打印到关闭的输出。这是报告异常的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。