Al detectar una excepción general, ¿cómo puedo determinar el tipo de excepción original?

Al detectar una excepción en .NET, puede tener tantos bloques de excepción específicos de tipo como sea necesario. Pero generalmente trato de tener al menos un bloque de captura de excepción "general". Pero, ¿hay una manera de obtener el tipo de excepción "real" que se genera mediante el controlador de excepciones genérico, tal vez utilizando la reflexión?

Por ejemplo, si tengo

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)

(Los he separado para la depuración, aunque hago lo mismo con cada excepción).

En resumen, en "Catch ex As System.ServiceModel.FaultException" quiero examinar "ex" y obtener el tipo "real" básico de la excepción, ya sea como un tipo (principalmente para la depuración, por lo que puedo agregar otro bloque catch) o como una cadena (para el registro).

Pero, dentro del bloque de captura, "ex" ya se ha convertido a su clase principal, por lo que cualquier propiedad original e información sobre la excepción original parece haberse perdido.

Sugerencias?

Respuestas a la pregunta(4)

Su respuesta a la pregunta