The CLS is more restrictive than the CLR, which would allow you to throw and catch any type of objects (even value types). Why?
Also what would happen if some non CLS-compliant code threw a non Exception derived object while called by a CLS compliant code?
UPDATE Second question answered by @Marton. Still wonder why.
Best How To :
CLS specifies a minimum set of language features needed by many applications in such a way that if an API uses only those features, it can be consumed by any CLS-compliant language. So naturally it is more restrictive than the CLR. On the other hand, the CLR is deigned to handle manged code from any CLI-compliant language.
An example of a language that allows throwing non-CLS-compliant exceptions (those not derived from System.Exception) is C++/CLI. This language was designed to be a superset of plain C++ which includes the ability to throw exceptions of any type. This could be the only good reason to throw non-CLS exceptions.
Regarding the second question. A non-CLS exception, when thrown, different things happen in different cases:
In C#, in the first bullet above and the second case of the second bullet, the only way to catch a non-CLS exception is by using a parameterless catch block.