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

Zwo*_*Rmi 0 c# exception object-initializers

我们考虑一下这段代码:

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

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

MyException myException = new MyException("message", e);
myException.SomeMyExceptionProperty = "something";
throw myException;
Run Code Online (Sandbox Code Playgroud)

或者像这样(所以SomeMyExceptionProperty没有初始化):

MyException myException = new MyException("message", e);
throw myException;
myException.SomeMyExceptionProperty = "something"; //unreachable code
Run Code Online (Sandbox Code Playgroud)

我认为使用了第一个行为,就像return声明一样,但官方文档在哪里?

Jon*_*eet 6

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

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

  • 关键字 throw
  • 一个表达式,用于确定要抛出的异常

在这种情况下,表达式包括对象初始值设定项.将整个表达式任何抛出之前进行评估.

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

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

评估表达

new MyException
    ("message", e)
    {SomeMyExceptionProperty = "something"}
Run Code Online (Sandbox Code Playgroud)

...包括将值赋值"something"SomeMyExceptionProperty.