对于我正在开发的简单控制台应用程序,我想实现一个非常基本的异常处理(只打印异常消息并终止程序)。我想要实现的逻辑是:如果异常有内部异常,则打印内部消息;否则打印自己的例外消息。
我尝试使用新的C#6 null传播运算符实现它,如下所示:
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
。
我认为我在某种程度上误解了null传播运算符的工作原理(可能它与null合并运算符一起工作)。我错过了什么?
注意:请不要告诉我如何使用C#5实现相同的行为(谢谢,但我已经知道了);我对null传播运算符的工作方式特别感兴趣。
答案 0 :(得分:6)
你现在正在做的是:
("--- Error: " + ex.InnerException?.Message) ?? ex.Message
null-coalescing运算符遍历第一部分,而不是遍历异常部分。由于它产生"--- Error: " + null
,因此它不为空并继续。
使用此:
"--- Error: " + (ex.InnerException?.Message ?? ex.Message)
(注意最好在异常上做.ToString()
而不是获取它的消息。现在你丢失了调用堆栈等。)