2010-10-14 31 views
3

可能重複:
Does a exception with just a raise have any use?捕捉異常並立即提升它的任何值?

有什麼價值,重新拋出一個異常,中間沒有任何其他代碼?

try: 
    #code 
except Exception: 
    raise 

我最近正在瀏覽一些代碼,看到了一些像這些塊沒有額外的除了塊,但另一個提高。我認爲這是一個錯誤和糟糕的決策,對嗎?

+0

......你說得對,它是重複的。就他而言,代碼確實有分裂子類的有效要求。 – 2010-10-14 22:21:57

回答

2

我曾經在一組可怕的VB.NET項目中看到類似的代碼。或者意圖是捕獲並記錄異常,而沒有回來完成日誌記錄,或者他們聽到「你必須捕獲異常」,實現了這個功能,而其他人則認爲它應該重新提升。

上述代碼沒有任何好處。

2

我不能拿出一些有用的東西,除了保留它作爲佔位符以便稍後插入以捕獲有用的異常。

這種避免重新縮進代碼,當你想包括「try .. except ..」塊以後。

1

是的,這通常是一個不好的做法。在VB.NET有Using構造可用之前,我已經看到這種模式的唯一(有點)正確的用法。用法看起來像這樣:

Dim myResource As DisposableService 

Try 
    myResource = New DisposableService() 
    ' This might throw an exception.... 
    myResource.DoSomething() 
Catch 
    Throw 
Finally 
    ' Perform cleanup on resource 
    If Not myResource Is Nothing Then 
     myResource.Dispose() 
    End If 
End Try 

除此之外,我真的不能想到這種事情的好用例。

+0

哈。有趣的是,我們都有vb.net的例子! – 2010-10-14 21:14:45

+1

有趣的;或悲傷? ;) – DanP 2010-10-14 21:18:37

+0

難道你不能忽略catch-throw序列嗎? – Yuliy 2010-10-14 21:19:53

0

通常在try-catch模型中,任何未捕獲的異常都會自動拋出(引發?)。捕捉異常只是爲了重新拋出它可能是靈魂的Allman風格編碼,但不起作用。

0

呃,試想

def something(a,b): 
    try: 
     // do stuff 
    except SomethingSpecificToThisFunction: 
     //handle 
    except: //Everything else, should likely be handled somewhere else 
     raise 


try: 
    something("a","b") 
except e: 
    Log(e) 

話又說回來其默認行爲反正,所以可能只是想離開它

2

實例建立在this question。如果在try區塊中還有其他一些except,則可以使用它來過濾例外情況,但僅此而已,這毫無意義。

class FruitException(Exception): pass 

try: 
    raise FruitException 
except FruitException: 
    print "we got a bad fruit" 
    raise 
except Exception: 
    print "not fruit related, irrelevant." 
0

在多線程環境中有這樣的技術的一些方法。例如把東西扔到堆棧的上層。

1

有時有用的,讓我給你一個真實的例子,我做我自己的工作:

這是一個裝飾那套FUNC:所以基本上我所想要的是重新引發錯誤,我在我調用函數func時捕捉到了,因此裝飾器不會更改函數func的行爲,因爲當func引發異常時,異常將發送到GUI,以便可以彈出錯誤消息給用戶,

和試用,除了我使用它,因爲我想在最後執行代碼,即使發生異常

try: 
    result = func(self, *args, **kws) 
    return result 
except Exception, ex: 
    # If an exception is raised save it also. 
    logging_data['message'] = str(ex) 
    logging_data['type'] = 'exception' 

    # Raise the error catched here so that we could have 
    # the same behavior as the decorated method. 
    raise 
finally: 
    # Save logging data in the database 
    .... 

希望這會有助於理解使用重新提升