2016-09-07 89 views
1

在測試的一段代碼,看起來有點像,我已經得到了一驚:引發錯誤不會阻止try-except子句執行嗎?

if x: 
    try: 
      obj = look-for-item-with-id==x in a db 
      if obj is None: 
       # print debug message 
       raise NotFound('No item with this id') 
      return obj 
    except Exception, e: 
     raise Error(e.message) 

我預計,如果沒有項目,在一個數據庫提供的ID(X),該NotFound異常會被撫養。但是,在獲得if子句並打印調試消息後,它會轉到except子句並引發異常(exc消息是Item not found ...)。有人可以這樣善良,在這裏啓發我嗎?

+2

您正在引發'NotFound',捕獲它,然後引發'Error'。你期望會發生什麼? – tzaman

+0

好吧,我現在明白了。加註並不是逃避條款,而是被抓住。恥辱在我:) – fanny

回答

1

當你說except Exception, e:,你明確地捕捉(幾乎)任何例外可能在該區塊內得到提升 - 包括您的NotFound

如果你想NotFound本身進一步傳播,你根本不需要有一個try/except塊。

另外,如果您想在檢測NotFound但隨後繼續傳播同樣的異常做一些具體的,你可以使用空白raise語句來重新提升它,而不是提出新的異常,像你所做的事。是這樣的:

try: 
    # .. do stuff 
    if blah: 
    raise NotFound(...) 
except NotFound, e: 
    # print something 
    raise 

另外請注意,我已經改變了異常塊到except NotFound - 這是通常不使用except Exception,因爲它抓住了一切,它可以隱藏你可能沒有預期的錯誤是一個好主意。基本上,你想用except捕捉特定你知道如何處理的東西。

+0

我解決它就像那樣:嘗試:除了NotFound:等等,除了例外等等等等。我想要的是檢查項目是否被找到 - 如果沒有,找到RAISE NotFound,然後,如果沒有提出,檢查所有其他問題(我知道異常是一個過於寬泛的術語,它應該可能是一些數據庫錯誤在我的情況)。我的主要錯誤是假設提高NotFound會被提升爲NotFound,這會「破壞」該子句,不會被捕獲並導致錯誤。我需要閱讀更多關於例外的內容。無論如何,我會接受你的回答:) – fanny

-1

如果obj陣列請檢查長度或項目的計數爲零 這意味着OBJ不是沒有,但不包含項目

+0

謝謝,但obj是無...我已經做了一些調試 – fanny

+1

範妮正在測試'如果obj是None:',而不是'如果obj:',所以空的「虛假」列表不適用於此。 –

相關問題