2010-10-06 150 views
1

我的工作場所規定了不使用例外的規則(允許捕捉)。如果我有這樣Python:我不允許引發異常。還有其他優雅的Python方法嗎?

def f1() 
if bad_thing_happen(): 
    raise Exception('bad stuff') 
... 
return something 

代碼,我可以將其更改爲

def f1() 
    if bad_thing_happen(): 
    return [-1, None] 
    ... 
    return [0, something] 

F1呼叫者會是這樣

def f1_caller(): 
    code, result = f1(param1) 
    if code < 0: 
    return code 
    actual_work1() 
    # call f1 again 
    code, result = f1(param2) 
    if code < 0: 
    return code 
    actual_work2() 
    ... 

有沒有在Python更優雅的方式比這個?

+5

告訴你我的工作地點,我討厭他們。至於優雅的方式,那麼,這將是例外....你在做什麼是好的(這很像c錯誤代碼,只是更好),但我會返回一個元組而不是一個列表。這樣,你可以說成功,結果= f1(參數) – JoshD 2010-10-06 03:40:01

+16

沒有例外編寫C++代碼是有用的理由,但沒有它們編寫Python代碼是無稽之談。例外是Python的絕對基礎。我強烈建議尋找最近的塑料蝙蝠,並儘可能多次擊中你的破壞性不稱職的老闆。 – 2010-10-06 03:41:26

+1

我和格倫在一起。高爾夫俱樂部雖然更好,同樣的力量應用在一個較小的區域。 – dutt 2010-10-06 03:46:21

回答

3

例外在python是要避免的東西,並且往往是解決問題的簡單方法。此外,一個異常帶有大量的信息,可以幫助快速定位(通過堆棧跟蹤)並識別問題(通過異常類或消息)。如果誰想出了這個一攬子政策,肯定會想到另一種語言(也許是C++?),其中拋出異常是一個更昂貴的操作(並且如果您的代碼在20年前的計算機上執行,將會降低性能)。

要回答你的問題:另一種方法是返回一個錯誤代碼。這意味着你將函數結果與錯誤處理混合在一起,這就引發了(ha!)它自己的問題。但是,返回None通常是指示功能故障的完美合理方式。

+0

當這種政策實施時,通常是由於一些幻覺的擔憂。有些「高級」開發人員在某種程度上受到某種東西的影響,現在害怕它,並且迫使無理的恐懼。 – 2010-10-06 03:55:21

1

返回None是相當普遍和良好概念的作品。如果您希望得到一個返回值,並且您沒有收到任何值,那麼這是一個很好的跡象表明出現了問題。

另一種可能的方法是,如果您希望返回一個列表(或字典等),則返回一個空的列表或字典。這可以很容易地使用if進行測試,因爲一個空的容器計算爲在Python False,如果你要遍歷它,你甚至可能不會需要檢查它(取決於你想如果函數失敗怎麼辦)。

當然,這些方法不告訴你爲什麼函數失敗。所以你可以返回的例外情況,如return ValueError("invalid index")。然後,您可以使用isinstance()測試特定的例外情況(或一般情況下的例外情況)並打印它們以獲取體面的錯誤消息。 (或者你可以提供一個幫助函數來測試返回碼,看它是否來自Exception。)你仍然可以創建你自己的Exception子類;你會簡單地返回而不是提高它們。

最後,我想對得到這個荒謬的政策改變,作爲例外Python如何工作的一個重要組成部分的工作,具有低開銷,並會利用你的函數任何人的預期。

1

您必須使用返回碼。其他的選擇會涉及可變的全局狀態(思考C的錯誤)或傳入可變對象(如列表),但你幾乎總是希望避免在Python中。也許你可以試着向他們解釋exceptions let you write better post-conditions而不是增加複雜性返回值,但是在其他方面是等價的。

相關問題