异常抛出

11

在C#中,以下代码是否会将包含额外信息的 e 抛出到调用堆栈上?

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

12

是的,它会。许多开发人员没有意识到以下代码将从调用栈中的该点抛出新异常,而不是在 catch 之前执行的先前调用。

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

我吃了亏才懂得这个道理!


1
这是来自Eric Lippert的文章:http://blogs.msdn.com/ericlippert/archive/2010/03/04/too-much-reuse.aspx “throw;”不会重置堆栈跟踪,“throw ex;”会这样做。 - ram

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

异常并非不可变的,能够向其添加信息便是其中之一。

因此,是的,数据将会被添加到上溯的异常信息中。


1

你可以这样做,但由于 FxCop 的缘故,每当我抛出异常时,我总是创建自定义异常。这使得调用者能够轻松地捕获和理解不同类型的错误。如果您需要包含后续异常,可以使用 Exception 的 InnerException 或简单地添加一个成员变量来表示新的异常。

这告诉您如何成功地创建自己的异常。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

这是那些人们喜欢跳过的编程事情之一,因为它只是额外的工作,以使应用程序功能正常。

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

你的程序就像你的房子。让它尽可能漂亮,这样住起来就容易而且有趣。


对于创建/捕获自定义异常的建议,点个赞。显然,这取决于您是否控制抛出异常的代码,如果是第三方库,则只能使用它抛出的任何异常。;-) - Andy Shellam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接