问题描述
版本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
因为它无法打印到关闭的输出。这是报告异常的原因。