簡體   English   中英

Python異常 - 循環中具有try ... except子句的函數

[英]Python exceptions - a function with try…except clause in a loop

我經常遇到這樣的情況:

import os

for i in range(10):
    os.mkdir(i)

但是,有時目錄已經存在,在這種情況下os.mkdir會引發OSError。 當發生這種情況時,我只是希望它跳過循環的其余部分並移動到i的下一次迭代,所以我經常寫這樣的東西:

for i in range(10):
    try:
        os.mkdir(i)
    except OSError:
        continue

但是,我真正想要的是一個封裝該行為的函數。 像這樣的東西:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)
    except OSError:
        continue

這樣我可以有一些像這樣的代碼:

for i in range(10):
    custom_mkdir(i)

具有預期的行為,如果目錄不存在,它會跳轉到for循環的下一個交互,如果它存在的話。

但是,continue語句不能以這種方式包含在函數中。 因此,如何不采取以下措施來獲得預期的行為:

for i in range(10):
    try:
        custom_mkdir(i)
    except OSError:
        continue

哪個比第一個更糟?

好吧,如果循環內部沒有其他內容,你可以這樣做:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)
    except OSError:
        pass

for i in range(10):
    custom_mkdir(i)

如果在custom_mkdir下面實際上有更多代碼,我認為你能做的最好的是:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)
        return True
    except OSError:
        return False

for i in range(10):
    if not custom_mkdir(i):
       continue

要么

for i in range(10):
    if custom_mkdir(i):
        # The rest of the logic in here

至少比原作簡潔一點。

OSError被捕獲在custom_mkdir ,您的函數真正想要做的就是什么都不做。 因此,什么都不做:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)
    except OSError:
        pass

回來一個布爾:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)            
    except OSError:
        return False
    return True

for i in range(10):
    if not custom_mkdir(directory): continue

碼:

def cusyom_mkdir(diectory):
try:
    os.mkdir(directory)
    return True
except OSError:
    return False

status = map(cusyom_mkdir,[i for i in range(10)])

要么

def cusyom_mkdir(diectory):
try:
    os.mkdir(directory)
    return True, directory
except OSError:
    return False, directory

status = map(cusyom_mkdir,[i for i in range(10)])

您可以看到目錄創建失敗,目錄創建失敗

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM