【发布时间】:2020-10-14 10:23:27
【问题描述】:
我有以下代码:
版本 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
为什么我会忽略异常? 另外,为什么把汤的内容发送到标准输出?
【问题讨论】:
-
当您尝试关闭已经关闭的文件时,可能会发生错误的文件描述符。但如上所述 - 请提供有关您的代码的更多详细信息。
-
@ThierryLathuille
IOError是自 Python 3.3 起OSError的别名 -
我已经用独立的、可运行的例子更新了这个问题。