可能重複:
Does a exception with just a raise have any use?捕捉異常並立即提升它的任何值?
有什麼價值,重新拋出一個異常,中間沒有任何其他代碼?
try:
#code
except Exception:
raise
我最近正在瀏覽一些代碼,看到了一些像這些塊沒有額外的除了塊,但另一個提高。我認爲這是一個錯誤和糟糕的決策,對嗎?
可能重複:
Does a exception with just a raise have any use?捕捉異常並立即提升它的任何值?
有什麼價值,重新拋出一個異常,中間沒有任何其他代碼?
try:
#code
except Exception:
raise
我最近正在瀏覽一些代碼,看到了一些像這些塊沒有額外的除了塊,但另一個提高。我認爲這是一個錯誤和糟糕的決策,對嗎?
我曾經在一組可怕的VB.NET項目中看到類似的代碼。或者意圖是捕獲並記錄異常,而沒有回來完成日誌記錄,或者他們聽到「你必須捕獲異常」,實現了這個功能,而其他人則認爲它應該重新提升。
上述代碼沒有任何好處。
我不能拿出一些有用的東西,除了保留它作爲佔位符以便稍後插入以捕獲有用的異常。
這種避免重新縮進代碼,當你想包括「try .. except ..」塊以後。
是的,這通常是一個不好的做法。在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
除此之外,我真的不能想到這種事情的好用例。
通常在try-catch模型中,任何未捕獲的異常都會自動拋出(引發?)。捕捉異常只是爲了重新拋出它可能是靈魂的Allman風格編碼,但不起作用。
呃,試想
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)
話又說回來其默認行爲反正,所以可能只是想離開它
實例建立在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."
在多線程環境中有這樣的技術的一些方法。例如把東西扔到堆棧的上層。
有時有用的,讓我給你一個真實的例子,我做我自己的工作:
這是一個裝飾那套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
....
希望這會有助於理解使用重新提升
......你說得對,它是重複的。就他而言,代碼確實有分裂子類的有效要求。 – 2010-10-14 22:21:57