我有一个循环,它运行多次并且容易出现异常(它是基于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
。
答案 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;