【问题标题】:Python try except, try again after executing except statementPython尝试except,执行except语句后重试
【发布时间】:2022-01-12 09:23:12
【问题描述】:

我正在尝试执行一条语句,但如果它失败了,我想执行 except 语句,然后我想再次执行 try。我知道我可以使用循环,但我正在寻找更优雅的解决方案。

在我的用例中,我尝试将文件保存到文件夹中,但如果出现 FileNotFoundError,我想在 except 中创建文件夹并再次尝试。

from pathlib import Path
import os

folder = Path('folder')
df = [a,b,c]

try:
    df.to_feather(folder / 'abc.ftr')
except:
    os.makedirs(folder)
    df.to_feather(folder / 'abc.ftr')

但在这种情况下,我会重复 df.to_feather(folder / 'abc.ftr') 语句。如果语句变大,这会很烦人,我不想为此构建一个函数。

另一种方式可能是:

if folder not in os.listdir():
    os.makedirs(folder)

df.to_feather(folder / 'abc.ftr')

这是解决这个问题的“正确”方法吗?

【问题讨论】:

标签: python try-except filenotfounderror


【解决方案1】:

由于python3.2 os.makedirs 有可选的exist_ok 参数,默认为False。当设置True 和os.makedirs 被指示创建已经存在的目录时,它是无操作的。因此代替

if folder not in os.listdir():
    os.makedirs(folder)

df.to_feather(folder / 'abc.ftr')

你可以这样做

os.makedirs(folder, exist_ok=True)
df.to_feather(folder / 'abc.ftr')

【讨论】:

  • 虽然这回答了用户的特定情况,但它错过了关于如何尝试某事以及如果失败了在中间做某事以纠正第一次失败后重试的问题的一般答案。
  • @SembeiNorimaki - 仅仅因为有人问如何做某事并不能使其成为实现预期结果的最佳方式。尽管问题是关于在发生异常时重试,但通常最好首先避免异常。该问题还继续询问检查并创建丢失的文件夹是否“是解决此问题的'正确'方法?”。所以我认为大宇的回答是完全正确的。
  • @Tony “首先避免异常通常会更好。”为什么?在 Python 中? EAFP 怎么了?
  • @athing - 是的,我承认我来自 C/C++ 背景,其中异常在计算上的成本更高:) 但这并不能使它们在 Python 中免费。如果您希望操作经常失败,那么在某些情况下,首先检查会更有效。但在这种特殊情况下,当与文件系统交互时,这是一个已解决的问题,如本答案中所述。
【解决方案2】:

要回答标题中的问题,您可以递归地这样做:

def do_stuff(x):
    try:
        stuff(x)
    except SpecificException:
        other_stuff(x)
        do_stuff(x)

如果你想创建一个文件,你可以使用:

pathlib.Path('/tmp/sub1/sub2').mkdir(parents=True, exist_ok=True)

【讨论】:

  • 明智的做法是检查导致异常的原因,如果可以纠正错误,则仅再次调用do_stuff,否则您将递归直到堆栈溢出。
  • 裸露除了危险
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2013-11-28
  • 2020-12-11
  • 1970-01-01
  • 2019-08-05
  • 2013-04-10
相关资源
最近更新 更多