在C#中,下面的代碼會拋出包含調用堆棧中附加信息的e
?異常拋出
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw;
}
在C#中,下面的代碼會拋出包含調用堆棧中附加信息的e
?異常拋出
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw;
}
是的,它會的。很多開發人員並沒有意識到下面的代碼會在調用棧中拋出新的異常,而不是在catch
之前先前調用堆棧的調用。
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw e;
}
我學會了這個艱難的道路!
異常並不是不可變的,並且能夠向它們添加信息是其中一個原因。
所以,是的,數據將被添加到異常信息冒泡。
var answer = "No";
try
{
try
{
throw new Exception();
}
catch (Exception e)
{
e.Data.Add("mykey", "myvalue");
throw;
}
}
catch (Exception e)
{
if((string)e.Data["mykey"] == "myvalue")
answer = "Yes";
}
Console.WriteLine(answer);
Console.ReadLine();
當您運行的代碼,你會發現,答案是肯定的:-)
......非常有趣;) – Ben 2010-03-16 12:14:34
你可以做到這一點,但由於FxCop的我總是創建自定義異常當過我拋出和異常。這使調用者能夠輕鬆捕捉並理解不同類型的錯誤。如果您需要包含後續異常,則可以使用異常的InnerException或簡單地爲新的異常添加成員變量。
這告訴你如何讓你自己成功。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/
這是人們喜歡跳過的編程事物之一,因爲它只是額外的工作以獲得應用程序的功能。
這是我個人編程之禪的一頁:
你的計劃是你的房子。儘可能地做到這一點,所以它很容易和有趣的生活。
+1對於創建/捕獲自定義例外。它顯然取決於你是否能夠控制拋出異常的代碼,如果它是第三方庫,你會被它拋出的異常阻塞;-) – 2010-03-16 12:33:51
+1爲反例:) – Pharabus 2010-03-16 12:19:22
這裏是來自Eric Lippert的文章:http://blogs.msdn.com/ericlippert/archive /2010/03/04/too-much-reuse.aspx 「The throw;」不重置堆棧軌跡,「throw ex;」是否「 – ram 2010-03-16 12:25:20