0

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

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

class KeywordException
{
    Exception ex;
    string faultURL;
}

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

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

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

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

4

3 回答 3

1

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

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

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

于 2012-04-13T11:32:01.417 回答
1

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

if (keywordException.ex is ArgumentNullException)

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

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

Type exceptionType = keywordException.ex.GetType();

...但仍不清楚为什么您要以与其他异常不同的方式处理某些异常。

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

WebException webException = keywordException.ex as WebException;
if (webException != null)
{
    // Use webException here
}
于 2012-04-13T11:32:38.250 回答
1

问题是您的 KeywordException 类将异常存储为异常(这很有意义并且可能是正确的)。

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

string exceptionType = keywordException.ex.GetType().Name;
于 2012-04-13T11:39:34.360 回答