到达内部对象

本文关键字:内部对象 | 更新日期: 2023-09-27 18:31:12

我有一个循环,它运行多次并且容易出现异常(它是基于Web的)。但是,我不想直接从该方法中抛出任何内容,因为我希望它在下一次迭代中移动,以防出现错误。所以我所做的是添加调用者传递的引用参数,所有异常都放在那里。

我想向用户返回异常以及错误 URL,因此我创建了以下对象:

class KeywordException
{
    Exception ex;
    string faultURL;
}

它作为ref List<KeywordException> exceptions返回给用户

好的,到目前为止一切都很好,我遇到了这样的异常:

catch (ArgumentNullException ane)
{
    exceptions.Add(new KeywordException(ane, URL));
    continue;
}

它可以工作并将异常返回给用户,但是我如何从调用代码中知道异常实际上是什么?在这种情况下,我得到的只是Exception它实际上是一个ArgumentNullException

到达内部对象

问题是您的 KeywordException 类将异常存储为 Exception(这是有道理的,并且可能是正确的)。

为什么想知道异常的确切类型? 是向用户显示消息吗? 在这种情况下,您可以使用反射来获取 ex 变量的具体类型:

string exceptionType = keywordException.ex.GetType().Name;

您可以查看 InnerException 属性 - 它存在于每个异常中。

此信息也将位于异常的堆栈跟踪中。

Exception 的一个构造函数采用Exception - 如果您使用它,InnerException将设置为传入异常。

即使KeywordException.ex编译时类型只是Exception,当你记录它时,你会看到真正的对象。您可以使用以下方法测试特定类型:

if (keywordException.ex is ArgumentNullException)

但我怀疑你想这样做。您应该可以无条件地记录异常 - 或者以您想要的任何形式向用户显示它。

编辑:当然,您也可以在异常上调用GetType()以获取其类型:

Type exceptionType = keywordException.ex.GetType();

。但目前还不清楚为什么您要将某些异常与其他异常区别对待。

编辑:如果需要在异常中使用特定于类型的信息,则应使用以下内容:

WebException webException = keywordException.ex as WebException;
if (webException != null)
{
    // Use webException here
}