Non-CLS Exceptions


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:


try


{


   // Some code here which might


   // throw non-CLS compilant exception


}


catch (Exception ex)


{


   // Here we will be catching any


   // CLS compliant type of exceptions


}


catch


{


   // Here we will be catching any


   // 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)]

Comments (0)