天天看點

C# 異常處理(Catch Throw)IL分析

1、catch throw的幾種形式及性能影響:

        對應的il代碼(以下代碼是release版本的il代碼):

        可以看到form1_click、form1_load、form1_enter中的try catch已經被編譯器優化掉了:

        隻有form1_doubleclick中的try catch中對try catch進行了處理:

        即在form1_doubleclick中的try catch才會對性能産生影響。

==》可以看出一下三種try catch的寫法對于release版本的代碼來說是完全一樣,也不會産生任何的性能消耗:

對于上面的結論大家可以寫測試demo驗證一下 (已測試,結果與分析一緻

C# 異常處理(Catch Throw)IL分析

)。       

那麼對于debug模式下的il代碼是什麼樣子的呢?

        可以看出四種寫法在debug模式下差別隻是:rethrow與throw的差別。il中rethrow與throw分别代表啥呢?

        throw:引發目前位于計算堆棧上的異常對象。

        rethrow:再次引發目前異常。

        即當我們抛出一個異常時, clr會重新設定一個異常起始點。 clr隻記錄最近一次異常抛出的位置。下面代碼抛出一個異常,進而導緻clr重新設定該異常的起始點:

        相反,如果我們抛出一個異常對象, clr将不會重新設定其堆棧的起始點,下面代碼抛出一個異常,但不會導緻clr重新設定異常的起始點:

        c#中使用throw和throw ex抛出異常,但二者是有差別的。

        在c#中推薦使用throw;來抛出異常;throw ex;會将到現在為止的所有資訊清空,認為你catch到的異常已經被處理了,隻不過處理過程中又抛出新的異常,進而找不到真正的錯誤源。

throw e重新抛出異常,并非轉發原來的異常,而會更改包括stacktrace在内的許多異常内部資訊;對于調用連很深情況,性能損耗超出想象。

拓展閱讀:

<a target="_blank" href="http://blog.csdn.net/jiankunking/article/details/49443493">il指令詳細</a>

繼續閱讀