当实际的“ for”语句中出现异常时,您如何“继续”?

时间:2019-11-11 19:00:04

标签: python python-3.x loops exception

这是一个简单的例子。
这是一个递归函数(即它自己调用),它试图列出目录(child)的内容(parent ren)。

  1. 如果child文件,则仅打印文件名。

  2. 如果child目录,它将打印目录的名称并尝试列出它的内容,依此类推。

  3. 如果child是一个目录,但是用户无权读取其内容,则会引发异常(OSError)。因此,我们用try:except OSError: continue包装它,以防止循环终止。它说:“当特权不足时,请不要停止;继续前进;只需将其移开,然后移至下一个。”


#!/usr/bin/env python3

import os

def list_children(parent):
    for child in os.listdir(parent):
        try:
            if os.isdir(child):
                print(child)
                list_children(child)
            elif os.isfile(child):
                print(child)
        except OSError:
            continue

list_children('/home')

但是,continue仅在循环体内起作用(例如forwhile),当实际的for抛出异常时您可以做什么? (或while)循环表达式(即紧接循环主体之前的行),就像上面示例中的os.listdir()函数一样?

2 个答案:

答案 0 :(得分:2)

如果无法生成正在循环的东西,则continue不会有任何变化(即,如果没有循环,则无法进入循环的下一个迭代)。只需将整个内容包装在try中,或者仅包装第一顶层listdir,以使缩进在控制之下:

def list_children(parent: str) -> None:
    try:
        top_level = os.listdir(parent)
    except OSError:
        top_level = []

    for child in top_level:
        try:
            if os.isdir(child):
                print(child)
                list_children(child)
            elif os.isfile(child):
                print(child)
        except OSError:
            continue

答案 1 :(得分:2)

您可以将listdir的结果分配给一个变量,并将所有结果包装在try块中,如果此操作因OS错误而失败,则您将不需要进行任何迭代,因此只需从函数返回即可。否则,使用其中的try块开始for循环以跳过

#!/usr/bin/env python3

import os

def list_children(parent):
        try:
            results =  os.listdir(parent)
        except OSError:
            return

        for child in results :
            try:
                if os.isdir(child):
                    print(child)
                    list_children(child)
                elif os.isfile(child):
                    print(child)
            except OSError:
                continue

list_children('/home')