When catching an exception in .NET, you can have as many type-specific exception blocks as needed. But I usually try to have at least one "general" exception catch block. But is there a way to get the type of the "real" exception thrown that is caught by the generic exception handler, perhaps using reflection?
For example, if I have
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)
(I have broken them out for debugging, even though I do the same thing with each exception).
In short, in "Catch ex As System.ServiceModel.FaultException" I want to examine "ex" and get the base "real" type of the exception, either as a type (mostly for debugging so I can add another catch block) or as a string (for logging).
But, inside the Catch block, "ex" has already been cast to it's parent class, so any original properties and information about the original exception seem to be lost.
Suggestions?
Even though the Exception
has been cast to its parent class, you can still call GetType
to obtain its underlying concrete type (pardon my C#):
try {
// Do stuff
}
catch(Exception ex) {
Type exceptionType = ex.GetType();
}
If this is just for diagnostic purposes, you can log ex.ToString()
, which includes the underlying type by default (in addition to the stack trace, etc.) like this:
System.ArgumentException: lastName
at Tests.Program.Main(String[] args) in ...\Program.cs:line 22
.GetType
will still return its actual type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With