为什么我无法访问异常的 .Error 属性?

Kir*_*ace 1 .net c#

我有一个抛出图形ODataError异常的程序。我的捕获只是将异常捕获为通用异常:

catch (Exception ex) {
    Log.Write(ex);
}
Run Code Online (Sandbox Code Playgroud)

当我在 catch 上放置断点时,我可以将鼠标悬停在ex对象上并深入查看其属性:

在此输入图像描述

但如果我在立即窗口中输入以下内容,我会得到:

ex.Error
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,当然,任何尝试ex.Error.Message也是“未定义的”。

我怎样才能获得该内部的参考ex.Error.Message

LWC*_*ris 6

IntelliSense 弹出窗口(也称为“DataTip”)允许您使用所检查对象具有的实际基础类型来分析对象。然后,它将使用反射来显示和公开该对象必须提供的所有内容,无论检查变量的类型如何。

立即窗口允许您执行一些代码,就像您用自己的代码编写它们一样。但是,此代码必须遵守当前作用域中变量的声明类型。

您在这里有多种选择:

如果您想在实际代码中使用这些属性,最好实际捕获您想要处理的特定异常类型。如果适用,您还可以使用公共超类。例如,您可以使用catch (OperationCanceledException ex)to catch anyOperationCanceledException以及派生的TaskCanceledException. 在这种情况下,ex将允许您访问来自OperationCanceledException及其超类的所有内容,但不能访问特定于派生类的内容。这实际上就是您在那里所做的,但是通过选择最广泛的超类,除了该类已经在类型层次结构的顶层引入的所有内容之外,System.Exception实际上并没有提供太多具体的见解。exException

如果您只想在立即窗口中临时检查它,您可以在立即窗口中的代码行中添加一个简单的转换:((ODataError) ex).Error.Message

或者,根据您的使用(也是从本地上下文继承),您可能需要完全引用它,如下所示:((Microsoft.Graph.Models.ODataErrors.ODataError) ex).Error.Message

  • @Narish:这个答案不建议在代码本身中使用强制转换。它特别指出了像您提到的那样使用多个 catch 块的好处。但是,当您进行调试时,查看“立即”或“监视”或类似窗口,并且您已经知道正在查看的异常类型,则强制转换可以轻松地按需深入了解已知异常的属性。 (2认同)