到达内部对象
本文关键字:内部对象 | 更新日期: 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
}