繁体   English   中英

如果可能,使用 try 和 except 块或 elif 块处理 FileNotFoundError

[英]Handling a FileNotFoundError using a try and except block or an elif block if possible

我有一个我想用作路由源的驱动器列表。 我想尝试所有这些,直到函数找到有效的,以免抛出 FileNotFoundError。 我怎样才能最好地做到这一点? 我对如何使用 try 和 except 块处理这种情况知之甚少,但我想要一些具有以下代码中显示的逻辑的东西:

try:
   wb = openpyxl.load_workbook(Source_1)
except FileNotFoundError:
   wb = openpyxl.load_workbook(Source_2)
except FileNotFoundError:
       wb = openpyxl.load_workbook(Source_3)
except FileNotFoundError:
       wb = openpyxl.load_workbook(Source_4)
except FileNotFoundError:
       wb = openpyxl.load_workbook(Source_5)
except:
       print("File Not Found")

最好的方法是使用循环。 但也要考虑其他错误来源。

sources = [Source_1, Source_2, ...]

for source in sources:
    try:
        wb = openpyxl.load_workbook(source)
    except FileNotFoundError:
        continue
    except Exception as e:
        print("Couldn't load the file %s" % e)
        break
    else:
        # work here with the workbook wb
        do_work(wb)
        break
else:
    print("File Not Found")

解释:

  1. 来源列表将使您能够添加越来越多的来源
  2. continue将使for循环移动到下一个源
  3. 如果除了FileNotFoundError之外还有另一个错误(例如OSError ,循环将正常退出
  4. try块没有抛出异常时,第一个else块将起作用。 它会有wb变量。
  5. 当 for 循环耗尽时,将执行第二个else块。 换句话说,当没有找到任何文件时。

使用@JacobIRR 建议的评论,您可以遍历您的源代码,直到其中一个有效,否则打印错误消息。 这是一个如何实现的示例:

sources = (Source_1, Source_2, Source_3, Source_4, Source_5)

for source in sources:
    try:
        wb = openpyxl.load_workbook(source)
        break
    except FileNotFoundError:
        pass
else:
    print("File Not Found")

正如@JacobIRR 提到的那样做这样的事情,

Sources = [Source_1, Source_2, Source_3, Source_4, Source_5]
for source in Sources:
    try:
        wb = openpyxl.load_workbook(Source_1)
        break
    except FileNotFoundError:
        continue
else:
    print("File Not Found")

我想这段代码应该可以工作

wb = None
for source in [Source_1, Source_2, Source_3, Source_4, Source_5]:
  try:
    wb = openpyxl.load_workbook(source)
  except FileNotFoundError:
    continue
  except:
    raise

if wb is None:
  print("File Not Found")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM