2013-07-13 74 views
1

這裏是捕捉和拋出異常給被叫方的的Python:返回錯誤,而不是拋出

def check(a): 

    data = {} 

    if not a: 
     raise Exception("'a' was bad") 

    return data 

def doSomething(): 

    try: 
     data = check(None) 
    except Exception, e: 
     print e 

這裏的正常方式是一種替代+幾件事情我想:

  1. 「數據」是總是出現,'檢查'功能可以爲數據設置一些默認值,然後邏輯被包含在功能 中,不必重複。也意味着開發人員不會在發生異常時嘗試訪問數據。 (數據可以在「DoSomething的」功能最頂端被定義+分配一些默認)
  2. 你不必有嘗試/節選到處塞滿了「DoSomething的」功能

    def check(a): 
    
        errors = [] 
        data = {} 
    
        if not a: 
         errors.append("'a' was bad") 
    
        return data, errors 
    
    def doSomething(): 
    
        data, errors = check(None) 
        if errors: 
         print errors 
    

它有什麼問題嗎?人們的意見是什麼?

回答

1

幾年後,當你再次閱讀自己的代碼並試圖弄清楚你想要做什麼時,你會很高興所有的嘗試 - 除了有助於使完全明顯的混亂的東西是一個錯誤,什麼是數據。

+0

取決於您對程序員的評價+評論;) – Metalstorm

+0

其中一個不會簡單評論python代碼。 –

4

有時候第二種方法可能有用(例如,如果你正在做一系列相對獨立的操作,並且只想保留哪些操作失敗的記錄)。但是,如果您的目標是防止以不正確的狀態繼續(即,「發生異常時嘗試訪問數據的錯誤」),那麼第二種方法就不好。如果您需要做的檢查可言,你可能想要做這樣的:

def check(a): 
    data = {} 
    if not a: 
     raise Exception("'a' was bad") 
    return data 

def doSomething(): 
    data = check(None) 
    # continue using data 

也就是說,做檢查,如果它成功了,只是不停。你不需要用except「代替」代碼。你應該只使用try /除非你能以某種方式實際處理錯誤。如果你不能,那麼你想要異常繼續傳播,如果有必要,一路傳播並停止該程序,因爲這會阻止你以無效的方式使用data

此外,如果檢查後可能繼續,但仍然「訪問無效的data」出錯,那麼你沒有做一個很好的檢查。檢查的重點,如果有的話,應該確保只要檢查沒有引發異常就可以自信地繼續進行。你這樣做的方式,你基本上做兩次檢查:你運行check,然後你檢查一個異常。相反,只需運行檢查。如果失敗,引發異常。如果成功,繼續使用您的代碼。如果您想要檢查區分可恢復和不可恢復的錯誤並記錄不可恢復的錯誤,那麼只需在支票中進行記錄即可。

當然,在很多情況下,你可以把它更簡單:

def doSomething(): 
    data.blah() 
    # use data however you're going to use it 

換句話說,只要做你會做什麼。如果您使用data做一些不起作用的事情,您將會得到一個例外。通常沒有理由進行單獨的明確檢查。 (當然,檢查當然有正當的理由,一種情況是,如果實際操作昂貴並且可能在後期階段失敗,那麼您需要預先檢查有效性,以避免浪費時間在經過很長時間後會失敗的操作計算。另一個原因可能是操作涉及I/O或某種併發性,並可能會使某些共享資源處於無效狀態。)

+0

您仍然可以引發異常,捕獲它並打印錯誤消息或記錄錯誤 - 而不必在此時停止程序執行;例外情況會通過提醒讀者在代碼片段中可能發生的錯誤來提高代碼的可讀性。 – user1669710

+0

@ user1669710:如果您關心繼續使用無效數據,您可以,但不能。另外,如果您在發生異常時知道這不是什麼大不了的事情,那麼您應該使用警告來代替。 – BrenBarn

+0

對於在整個過程中出現任何錯誤時進行一次嘗試/除非是大量的語句 - 甚至是大部分腳本 - 以便進行清理時,它都會有用。這使得該過程可以「優雅地」失敗並終止使事情處於最佳狀態。 – martineau

1

嘗試/除非不混亂;它們通過指示這段代碼可以「期待」一個異常來增加代碼的可讀性。如果將邏輯「ifs」與錯誤處理「ifs」混合在一起 - 您可能會在代碼中失去一些可讀性。另外,如果你知道'a'是None,那麼你將會遇到的唯一一種錯誤就是,你可以寫一個if來處理它,在你給出的這個簡單例子中有意義。

但是,如果發生不同的錯誤,無論如何都會引發異常!

我不會推薦使用它作爲一般編程習慣來避免嘗試/除了任何地方。它承認並在發生異常的代碼中標記地點。

相關問題