2012-09-26 29 views
1

我與一些代碼搞亂,並面臨着一個特殊問題:的Python:如何忽略一個例外,同時還處理其他

def find_available_slug(object, instance, slug) 
    try: 
     sender_node = object.objects.get(slug=slug) 
    except object.DoesNotExist: 
     instance.slug = slug 
    else: 
     slug = '%s_' % slug 
     find_available_slug(object, instance, slug) 
    return 

我遇到的問題是,有時objects.get(slug=slug)拋出一個MultipleObjectsReturned異常,因爲這字段在我的數據庫中不是唯一的。我不知道我怎麼可以乾淨地趕上MultipleObjectsReturned而「else」語句仍然會被執行。

回答

0

另外,不要使用else條款都:

def find_available_slug(object, instance, slug) 
    try: 
     sender_node = object.objects.get(slug=slug) 
    except object.DoesNotExist: 
     instance.slug = slug 
     return 
    except object.MultipleObjectsReturned: 
     pass 

    slug = '%s_' % slug 
    find_available_slug(object, instance, slug) 
2

簡單的解決方案:訣竅是在調用get方法時,將MultipleObjectsReturned置於第二個try語句中。這樣,不會引發異常並且正常執行繼續。

作品:

def find_available_slug(object, instance, slug) 
    try: 
     try: 
      sender_node = object.objects.get(slug=slug) 
     except object.MultipleObjectsReturned: 
      pass 
    except object.DoesNotExist: 
     instance.slug = slug 
    else: 
     slug = '%s_' % slug 
     find_available_slug(object, instance, slug) 
    return 

不起作用:

def find_available_slug(object, instance, slug) 
    try: 
     sender_node = object.objects.get(slug=slug) 
    except object.MultipleObjectsReturned: 
     pass 
    except object.DoesNotExist: 
     instance.slug = slug 
    else: 
     slug = '%s_' % slug 
     find_available_slug(object, instance, slug) 
    return 

第二個「天真」的方法不起作用的原因是,如果一個異常被捕獲,解釋器將不經過else:條款。它會寧靜地return

+0

@sebleblanc ..你剛剛回答了你自己的問題?或者我變得盲目了? –

+0

@RohitJain - 回答你自己的問題沒有錯。它經常發生。 – mgilson

+1

@ mgilson ..好吧,只是問..因爲他的問題和回答它的持續時間僅僅是幾秒鐘..其他,當然沒有錯.. –