C# 零传播+;处理InnerException时,null合并运算符未按预期工作
对于我正在开发的一个简单控制台应用程序,我希望实现一个非常基本的异常处理(只需打印异常消息并终止程序)。我想要实现的逻辑是:如果异常有内部异常,则打印内部异常的消息;否则,打印自己的异常消息 我尝试使用新的C#6空传播运算符实现它,如下所示:C# 零传播+;处理InnerException时,null合并运算符未按预期工作,c#,.net,c#-6.0,C#,.net,C# 6.0,对于我正在开发的一个简单控制台应用程序,我希望实现一个非常基本的异常处理(只需打印异常消息并终止程序)。我想要实现的逻辑是:如果异常有内部异常,则打印内部异常的消息;否则,打印自己的异常消息 我尝试使用新的C#6空传播运算符实现它,如下所示: try { //Test case 1: throw new Exception("Foo", new Exception("Bar")); //Test case 2: throw new Exception("Foo"
try
{
//Test case 1:
throw new Exception("Foo", new Exception("Bar"));
//Test case 2:
throw new Exception("Foo");
}
catch(Exception ex)
{
Console.WriteLine("--- Error: " +
ex.InnerException?.Message ?? ex.Message);
}
问题是,虽然测试用例1按预期工作(打印--错误:Bar
),但测试用例2只打印--错误:
,而不是预期的--错误:Foo
我认为我在某种程度上误解了null传播操作符的工作原理(可能是它如何与null合并操作符一起工作)。我错过了什么
注意:请不要告诉我如何使用C#5实现相同的行为(谢谢,但我已经知道了);我特别感兴趣的是空传播操作符是如何工作的。您现在要做的是:
("--- Error: " + ex.InnerException?.Message) ?? ex.Message
null合并运算符将覆盖第一部分,而不是异常部分。因为这会产生”---错误:“+null
,所以它不是null并继续
使用以下命令:
"--- Error: " + (ex.InnerException?.Message ?? ex.Message)
(请注意,最好对异常执行
.ToString()
,而不是获取其消息。现在您将丢失调用堆栈等。)永远不要执行此操作,请使用异常对象的ToString()方法。它从不出错,堆栈跟踪非常重要。@PeterDunihoex.InnerException?.Message
使用?。
运算符。@PeterDuniho请仔细查看。我两个都用了。对“离题”投赞成票吗?真的吗???对不起…我确实仔细看了,但显然不够仔细。谢谢!同意.ToString()
,但它是一个非常简单的一次性应用程序,我对本例中的消息非常感兴趣。