2011-03-02 47 views
8

我的代碼如下:玩轉提高IndexError

for p in qs: 
    set = None 
    try: 
     set = p.property.property_locations.all() 
    except IndexError: 
     pass 

    if set: 

問題是,當集是沒有它仍然django.db.models.query的這部分拋出IndexError:

try: 
    qs = self._clone() 
    qs.query.set_limits(k, k + 1) 
    return list(qs)[0] 
except self.model.DoesNotExist, e: 
    raise IndexError(e.args) 

如何阻止系統拋出此錯誤並繼續執行for循環中的下一個元素?

+0

當你重新命名爲不同的東西時,它會工作嗎? set是一個內建函數。 – Rudi 2011-03-02 11:48:00

+0

「設置爲無」時?你將'set'設置爲'None'。它必須**總是**是「無」。你的問題是什麼,真的嗎? – 2011-03-02 11:50:56

+1

究竟是什麼**是你的問題?將'QuerySet'對象分配給'set'將** **永遠不會引發'IndexError'。你能更精確一點嗎? – 2011-03-02 12:11:34

回答

14

在任何情況下,在你的代碼中有兩處錯誤:

  1. 集是內置(你可以從SO的語法高亮看),所以通過給你的變量命名你的陰影內建沒有目的,這至少是不好的做法,並可能在代碼後面引起問題。
  2. 的規範的方法來檢查組是不是沒有一個是通過寫作:如果設置不無

更重要的是,編寫代碼片段的典型方式是:

try: 
    [code that might raise an exception] 
except Error: 
    [code that handles the exception] 
else: 
    [code that executes when no exception was raised] 

(替代當然,實際例外的錯誤)

這樣,您甚至不必在該點檢查'設置'。