微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – 捕获常规异常时,如何确定原始异常类型?

在.NET中捕获异常时,您可以根据需要拥有尽可能多的特定于类型的异常块.但我通常会尝试至少有一个“常规”异常catch块.但有没有办法获得抛出通用异常处理程序捕获的“真正”异常的类型,也许使用反射?

例如,如果我有

Catch ex As System.ServiceModel.FaultException(Of InvalidUser)
     ProcessModuleLoadException(Me,ex)
Catch ex As System.ServiceModel.FaultException(Of sqlExceptions)
     ProcessModuleLoadException(Me,ex)
Catch ex As System.ServiceModel.FaultException(Of DatanullReference)
     ProcessModuleLoadException(Me,ex)
Catch ex As System.ServiceModel.FaultException
     ProcessModuleLoadException(Me,ex)
Catch ex As Exception
     ProcessModuleLoadException(Me,ex)

(我已经将它们分解出来进行调试,即使我对每个异常做同样的事情).

简而言之,在“Catch ex As System.ServiceModel.FaultException”中,我想检查“ex”并获取异常的基本“真实”类型,或者作为一种类型(主要用于调试,所以我可以添加一个catch块)或者作为字符串(用于记录).

但是,在Catch块中,“ex”已经被强制转换为它的父类,因此任何原始属性和有关原始异常的信息似乎都会丢失.

建议?

解决方法

即使Exception已经转换为其父类,您仍然可以调用 GetType获取其底层具体类型(请原谅我的C#):

try {
    // Do stuff
}
catch(Exception ex) {
    Type exceptionType = ex.GetType();
}

如果这仅用于诊断目的,您可以记录ex.ToString(),认情况下包括底层类型(除了堆栈跟踪等),如下所示:

System.ArgumentException: lastName
   at Tests.Program.Main(String[] args) in ...\Program.cs:line 22

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐