我也有類似的情況在遍歷使用美麗的湯鏈接。這個是我寫的代碼:
class suppressed_iterator:
def __init__(self, wrapped_iter, skipped_exc = Exception):
self.wrapped_iter = wrapped_iter
self.skipped_exc = skipped_exc
def __next__(self):
while True:
try:
return next(self.wrapped_iter)
except StopIteration:
raise
except self.skipped_exc:
pass
class suppressed_generator:
def __init__(self, wrapped_obj, skipped_exc = Exception):
self.wrapped_obj = wrapped_obj
self.skipped_exc = skipped_exc
def __iter__(self):
return suppressed_iterator(iter(self.wrapped_obj), self.skipped_exc)
一個例子:
class IHateThirteen:
''' Throws exception while iterating on value 13 '''
def __init__(self, iterable):
self.it = iter(iterable)
def __iter__(self):
return self
def __next__(self):
v = next(self.it)
if v == 13:
raise ValueError('I hate 13!')
return v
# Outputs [10, 11, 12, 14, 15]
exception_at_thirteen = IHateThirteen([10, 11, 12, 13, 14, 15])
print(list(suppressed_generator(exception_at_thirteen)))
# Raises ValueError
exception_at_thirteen = IHateThirteen([10, 11, 12, 13, 14, 15])
print(list(exception_at_thirteen))
您可以使用上面的代碼解決您的代碼:
for subdir, dirs, files in suppressed_generator(os.walk(path)):
do something...
上面的代碼可以擴展更多如果需要,每個跳過的異常類型都有回調函數,但在這種情況下使用iCodez's answer可能會更麻煩。
來源
2017-12-02 18:10:49
ofo
還可以更好地捕獲特定的UnicodeDecodeError,而不是任何常規異常「執行某些操作」可能引發。 – xnx
從'os.walk()'拋出的異常,不在'for'循環中,所以try/except對該異常不做任何處理。 – coanor
@coanor - 看我的編輯。 – iCodez