2010-03-16 272 views
11

在C#中,下面的代码会抛出包含调用堆栈中附加信息的e异常抛出

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw; 
} 

回答

12

是的,它会的。很多开发人员并没有意识到下面的代码会在调用栈中抛出新的异常,而不是在catch之前先前调用堆栈的调用。

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw e; 
} 

我学会了这个艰难的道路!

+0

+1为反例:) – Pharabus 2010-03-16 12:19:22

+1

这里是来自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

1

异常并不是不可变的,并且能够向它们添加信息是其中一个原因。

所以,是的,数据将被添加到异常信息冒泡。

4
 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();  

当您运行的代码,你会发现,答案是肯定的:-)

+1

......非常有趣;) – Ben 2010-03-16 12:14:34

1

你可以做到这一点,但由于FxCop的我总是创建自定义异常当过我抛出和异常。这使调用者能够轻松捕捉并理解不同类型的错误。如果您需要包含后续异常,则可以使用异常的InnerException或简单地为新的异常添加成员变量。

这告诉你如何让你自己成功。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

这是人们喜欢跳过的编程事物之一,因为它只是额外的工作以获得应用程序的功能。

这是我个人编程之禅的一页:

你的计划是你的房子。尽可能地做到这一点,所以它很容易和有趣的生活。

+0

+1对于创建/捕获自定义例外。它显然取决于你是否能够控制抛出异常的代码,如果它是第三方库,你会被它抛出的异常阻塞;-) – 2010-03-16 12:33:51