Many developers are not aware that according to CLR it is perfectly OK to throw exceptions which are NOT derived from System.Exception: Exceptions such as DateTime, Int64 and String. Although languages such as C# do not allows programmers to throw these types of exceptions it should still be possible to catch non-CLS compliant exceptions using a catch block.
Pre to CLR version 2.0, the only way to catch non-CLS compliant exceptions was to introduce a catch block with no Exception section:
// Some code here which might
// throw non-CLS compilant exception
catch (Exception ex)
// Here we will be catching any
// CLS compliant type of exceptions
// non-CLS compliant exceptions...
// Note that, this block on its own
// is capable of catching both compliant
// and non-compinat exceptions
In version 2.0 of CLR, any non-CLS compliant exception is automatically wrapped up by System.Runtime.CompilerServices.RuntimeWrappedException class which inherits from the Exception class. This class has a property which is set to the actual object which was thrown.
It is still possible to tell CLR not to wrap up the non-CLS compliant exceptions with the RuntimeWrappedException class. This is done using an attribute which affects the whole assembly:
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = false)]