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