Dot-Net
拋出異常的性能注意事項
我多次遇到以下類型的程式碼,我想知道這是否是一種好的做法(從性能的角度來看):
try { ... // some code } catch (Exception ex) { ... // Do something throw new CustomException(ex); }基本上,編碼人員所做的是他們將異常包含在自定義異常中並再次拋出該異常。
這在性能上與以下兩個有何不同:
try { ... // some code } catch (Exception ex) { .. // Do something throw ex; }或者
try { ... // some code } catch (Exception ex) { .. // Do something throw; }拋開任何功能或編碼最佳實踐論點,這 3 種方法之間是否存在性能差異?
@布拉德·塔特羅
在第一種情況下異常不會失去,它被傳遞給建構子。我會同意你的其餘部分,第二種方法是一個非常糟糕的主意,因為堆棧跟踪的失去。當我使用 .NET 時,我遇到了很多其他程序員這樣做的情況,當我需要查看異常的真正原因時,我感到非常沮喪,卻發現它從一個巨大的 try 塊中被重新拋出,其中我現在不知道問題出在哪裡。
我也贊同布拉德的評論,即你不應該擔心表現。這種微優化是一個可怕的想法。除非您正在談論在長時間執行的 for 循環的每次迭代中拋出異常,否則您很可能不會因異常使用而遇到性能問題。
當您有指標表明您需要優化性能時,請始終優化性能,然後點擊被證明是罪魁禍首的地方。
擁有易於調試功能的可讀程式碼(IE 不隱藏堆棧跟踪)比讓某些東西執行得快一納秒要好得多。
關於將異常包裝到自定義異常中的最後一點說明……這可能是一個非常有用的構造,尤其是在處理 UI 時。您可以將每個已知且合理的異常情況包裝到一些基本自定義異常(或從所述基本異常擴展的異常)中,然後 UI 可以擷取此基本異常。當被擷取時,異常需要提供向使用者顯示資訊的方法,比如 ReadableMessage 屬性,或者類似的東西。因此,任何時候 UI 遺漏一個異常,都是因為你需要修復一個錯誤,而任何時候它捕捉到一個異常,它都是一個已知的錯誤情況,可以並且應該由 UI 正確處理。