处理 InnerException 时,空传播 + 空合并运算符未按预期工作

Null propagation + null coalescing operator not working as expected when dealing with InnerException

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

我尝试使用新的 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 按预期工作(打印 --- Error: Bar),但测试用例 2 仅打印 --- Error: 而不是预期的 --- Error: Foo.

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

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

你现在正在做的是:

("--- Error: " + ex.InnerException?.Message) ?? ex.Message

空合并运算符遍历第一部分,而不是异常部分。由于这会产生 "--- Error: " + null,因此它不为空并继续。

使用这个:

"--- Error: " + (ex.InnerException?.Message ?? ex.Message)

(请注意,最好对异常执行 .ToString() 而不是获取其消息。现在您丢失了调用堆栈等)