Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 零传播+;处理InnerException时,null合并运算符未按预期工作_C#_.net_C# 6.0 - Fatal编程技术网

C# 零传播+;处理InnerException时,null合并运算符未按预期工作

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"

对于我正在开发的一个简单控制台应用程序,我希望实现一个非常基本的异常处理(只需打印异常消息并终止程序)。我想要实现的逻辑是:如果异常有内部异常,则打印内部异常的消息;否则,打印自己的异常消息

我尝试使用新的C#6空传播运算符实现它,如下所示:

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()方法。它从不出错,堆栈跟踪非常重要。@PeterDuniho
ex.InnerException?.Message
使用
?。
运算符。@PeterDuniho请仔细查看。我两个都用了。对“离题”投赞成票吗?真的吗???对不起…我确实仔细看了,但显然不够仔细。谢谢!同意
.ToString()
,但它是一个非常简单的一次性应用程序,我对本例中的消息非常感兴趣。