使用对象初始值设定项抛出新异常
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
.
让我们考虑一下这段代码:
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
.