2014-08-28 73 views
2

我經常遇到這樣的情況:Python的例外 - 與嘗試...除了條款中循環的功能

import os 

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

然而,有時一個目錄已經存在,在這種情況下os.mkdir拋出OSERROR 。發生這種情況時,我只是希望它跳過循環的剩餘部分,並移動到我的下一個迭代,所以我經常寫這樣的事情:

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 

這是比第一個更糟糕的情況嗎?

回答

5

好了,如果沒有什麼別的事情在循環中你可以這樣做:

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 

這至少比原文簡潔一點。

2

OSError被捕獲custom_mkdir時,你的功能真的想要做的就是什麼都不做。所以,什麼都不做:

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

沒有幫助來電者決定如何做雖然。 – 2014-08-28 23:52:34

+1

@JoshSmeaton:呼叫者*是否需要*決定要做什麼?在問題中發佈的代碼中,它沒有。 – jwodder 2014-08-28 23:55:41

+0

是的,來電者。這是問題的關鍵。如果「mkdir」失敗,OP希望「繼續」。他們只是想封裝嘗試/除了使循環看起來更整潔。 – 2014-08-28 23:56:34

0

僅僅返回一個布爾:

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 
0

代碼:([在範圍I對於i(10)] cusyom_mkdir)

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

狀態=地圖

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

status = map(cusyom_mkdir, [我爲我的range(10)])

您可以看到目錄成功創建目錄創建失敗