2010-03-23

throw 和 throw ex 的差別

看看你是否也寫過以下的 code:

    try
    {
        
// do something
    }
    
catch (Exception ex)
    {
        
// do something
        
throw ex;
    }
注意 throw ex; 這一行, 它的用意只是把原來的 exception 再次的抛出去, 看起來好像沒什麼問題, 但是其實這種寫法已經改變的原來的 StackTrace, 一般的用法如果想要抛出原來的例外應該是只要寫 throw; 就可以了, 這樣才能保留原有的 StackTrace, 以下範例可以比較清楚的看出這個問題:


    void Main() {
        
try {
            OuterCall();
        }
catch (Exception e) {
            Console.WriteLine(e.StackTrace);
        }
    }

    
static void InnerCall() {
        
throw new Exception();
    }

    
static void OuterCall() {
        
try    {
            InnerCall();
        }
catch (Exception ex) {
            
throw; // 試著將這行改成 throw ex;
        }
    }

第一種(throw;)執行結果為
at MyTest.InnerCall() in ...
at MyTest.OuterCall() in ...
at MyTest.Main() in ...


第二種(throw ex;)執行結果為






at MyTest.OuterCall() in ...
at MyTest.Main() in ...

差別應該看得很清楚了吧!





keywords: throw, exception, stacktrace

沒有留言: