到达内部对象

时间:2012-04-13 11:30:07

标签: c# winforms exception

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

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

class KeywordException
{
    Exception ex;
    string faultURL;
}

它以ref List<KeywordException> exceptions

的形式返回给用户

好的,到目前为止一切都很好,我也抓住了这样的例外:

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

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

3 个答案:

答案 0 :(得分:1)

您可以查看InnerException属性 - 它存在于每个例外。

此信息也将出现在异常的堆栈跟踪上。

Exception的其中一个构造函数需要Exception - 如果您使用此函数,InnerException将设置为传入的异常。

答案 1 :(得分:1)

即使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
}

答案 2 :(得分:1)

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

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

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