使用对象初始值设定项抛出新异常

时间:2016-02-22 10:30:24

标签: c# exception object-initializers

让我们考虑一下这段代码:

try
{
    return new ClassA.GetStuff();
}
catch (Exception e)
{
    throw new MyException
        ("message", e)
        {SomeMyExceptionProperty = "something"};
}

抛出MyException时,对象初始化是如何完成的?像这样:

MyException myException = new MyException("message", e);
myException.SomeMyExceptionProperty = "something";
throw myException;

或者像这样(因此SomeMyExceptionProperty未初始化):

MyException myException = new MyException("message", e);
throw myException;
myException.SomeMyExceptionProperty = "something"; //unreachable code

我认为使用了第一个行为,就像return语句一样,但关于此的官方文档在哪里?

1 个答案:

答案 0 :(得分:6)

与以往一样,官方文档是C#规范。

重要的是,这只是一个抛出声明。它有两部分(在这种情况下):

  • 关键字throw
  • 确定要抛出的异常的表达式

在这种情况下,表达式包括一个对象初始值设定项。在抛出任何内容之前评估整个表达式

来自C#5规范的第8.9.5节:

  

带有表达式的throw语句会抛出通过计算表达式生成的值。

评估表达式

new MyException
    ("message", e)
    {SomeMyExceptionProperty = "something"}

...包括将值"something"分配给SomeMyExceptionProperty