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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...