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

Throw new exception using object initializer

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

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 语句,但是关于这个的官方文档在哪里?

一如既往,官方文档是 C# 规范。

重要的是这只是一个 throw 语句。它有两部分(在本例中):

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

在这种情况下,表达式包含一个对象初始值设定项。 整个表达式在抛出任何东西之前被求值。

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

A throw statement with an expression throws the value produced by evaluating the expression.

计算表达式

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

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