在C#中,以下代码是否会在调用堆栈中抛出包含其他信息的e
?
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw;
}
答案 0 :(得分:12)
是的,它会的。许多开发人员没有意识到以下代码将从调用堆栈中的那一点抛出一个新的异常,而不是在catch
之前在堆栈之前进行的调用。
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw e;
}
我很难学到这一点!
答案 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();
运行代码时,您会发现答案是肯定的: - )
答案 2 :(得分:1)
例外不是不可变的,能够向他们添加信息是其中一个原因。
所以,是的,数据将被添加到冒泡的异常信息中。
答案 3 :(得分:1)
你可以这样做但是由于FxCop,我总是在抛出异常时创建自定义异常。这使调用者能够轻松捕获和理解不同类型的错误。如果您需要包含后续异常,则可以使用Exception的InnerException,或者只是为新Exception添加成员变量。
这告诉您如何让自己成功。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/
这是人们喜欢跳过的编程之一,因为它只是让应用程序正常工作的额外工作。
这是我个人编程Zen的页面:
你的程序是你的房子。尽可能好,让生活变得轻松有趣。