处理InnerException时,空传播+空合并运算符无法正常工作

Kon*_*man 2 .net c# c#-6.0

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

我尝试使用新的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);
}
Run Code Online (Sandbox Code Playgroud)

问题是,虽然测试用例1按预期工作(打印--- Error: Bar),但测试用例2只是打印--- Error:而不是预期--- Error: Foo.

我认为我在某种程度上误解了null传播运算符的工作原理(可能它与null合并运算符一起工作).我错过了什么?

注意:请不要告诉我如何使用C#5实现相同的行为(谢谢,但我已经知道了); 我特别感兴趣的是null传播运算符是如何工作的.

Pat*_*man 6

你现在在做什么是这样的:

("--- Error: " + ex.InnerException?.Message) ?? ex.Message
Run Code Online (Sandbox Code Playgroud)

null-coalescing运算符遍历第一部分,而不是异常部分.由于这产生了"--- Error: " + null,它不是空的并且继续.

用这个:

"--- Error: " + (ex.InnerException?.Message ?? ex.Message)
Run Code Online (Sandbox Code Playgroud)

(注意最好.ToString()在异常上做一个而不是获取它的消息.现在你丢失了调用堆栈等等)