这是一个简单的例子。
这是一个递归函数(即它自己调用),它试图列出目录(child
)的内容(parent
ren)。
如果child
是文件,则仅打印文件名。
如果child
是目录,它将打印目录的名称并尝试列出它的内容,依此类推。
如果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
仅在循环体内起作用(例如for
,while
),当实际的for
抛出异常时您可以做什么? (或while
)循环表达式(即紧接循环主体之前的行),就像上面示例中的os.listdir()
函数一样?
答案 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')