2016-12-18 105 views
9

到底是什麼之間的區別(以及要使用什麼):交易:除了或在e:例外?

try 
    UniTransaction1.Commit; 
except 
    UniTransaction1.Rollback; 
end; 

和:

try 
    UniTransaction1.Commit; 
except 
    on E:exception do 
    UniTransaction1.Rollback; 
end; 

不是 '除' 異常了嗎?

回答

11

前者將捕獲作爲例外引發的所有對象,後者僅包含衍生自類Exception的那些對象。

它不是很知名,但德爾福確實提供了不會從Exception派生的異常。那就是你完全可以自由地用一個不是從Exception派生出來的對象提出異常。在實踐中,我從來沒有遇到過這樣的事情。你根本沒有看到任何不是從Exception派生的代碼。對於所有意圖和目的而言,這意味着這兩個變體的行爲將完全相同。

由於您沒有引用異常對象,所以您似乎很少需要聲明一個永遠不會使用的變量。這給我們帶來另一種選擇:

on Exception do 
    .... 

這將捕獲所有異常相同的第二個變體,但是沒有聲明它可以引用異常對象的變量。

您應該使用哪一個?您可以使用它們中的任何一個並具有相同的行爲,當然假設您不會遇到不從Exception派生的異常。如果我是我,我會選擇你的第一個選擇。它是最簡潔的,它只是說你希望這個代碼在發生任何異常的情況下發生。

+0

這是很好的添加消息,如提高Exception.create(「數據庫事務失敗:」 + e.message)或某事這種方式用戶理解失敗......如果它證明了這一點,你的回答將會很好...... –

+1

@john這個問題涉及捕獲而不是提高 –

+3

我明白了,但是他的示例吞吞沒有任何通知的數據庫事務用戶很窮。 –

1

第二個選項允許你使用Exception對象添加行爲,如記錄異常,顯示詳細信息,以異常等

在你的情況的原因,你回滾數據庫事務,如果您沒有向用戶提供任何信息,他/她可能認爲事務已成功完成。在這種情況下,我會做這樣的事情:如果「上異常」使用

try 
    UniTransaction1.Commit; 
except 
    on E:exception do 
    begin 
    UniTransaction1.Rollback; 
    Raise; 
    end; 
end; 
+0

在特定情況下,重新提出例外可能有效或不可能有效。然而,總是這樣,使用例外向用戶報告錯誤是濫用和錯誤使用例外。除此之外,如果有外部異常處理程序「吞噬」您的異常,或者如果默認異常處理程序尚未被覆蓋,用戶可能永遠不會看到您仔細措辭的消息。未處理的異常消息的顯示只是默認行爲,並且可以更改。 **底線:** *例外情況不是爲了向用戶傳達錯誤*。 – Deltics

+0

當然,重新提出例外情況可能並非對所有情況都有效,這是顯而易見的,我並沒有建議在所有情況下都這樣做。我不知道這裏涉及的其他代碼是什麼,也許只是簡單的消息。 –

+2

@Deltics如果發生錯誤的地方無法報告錯誤,那麼您將如何做到這一點,沒有例外。你相信錯誤代碼? –