在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