在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();
异常并非不可变的,能够向其添加信息便是其中之一。
因此,是的,数据将会被添加到上溯的异常信息中。
你可以这样做,但由于 FxCop 的缘故,每当我抛出异常时,我总是创建自定义异常。这使得调用者能够轻松地捕获和理解不同类型的错误。如果您需要包含后续异常,可以使用 Exception 的 InnerException 或简单地添加一个成员变量来表示新的异常。
这告诉您如何成功地创建自己的异常。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/
这是那些人们喜欢跳过的编程事情之一,因为它只是额外的工作,以使应用程序功能正常。
这是我个人的编程禅意之一:
你的程序就像你的房子。让它尽可能漂亮,这样住起来就容易而且有趣。