CLR会处理CLS-Complaint和非CLS投诉例外吗?
仅供我澄清:
我可以在.NET Framework中同时抛出CLS-Complaint和非CLS投诉exception吗?我正在使用C#3.0。
当我抓住exception
catch(Exception ex) { }
- 它只会捕获CLS-Complaintexception吗?
- RuntimeWrappedException类有什么用(我可以举一个简单的例子吗?)。
- 是的,您可以在.NET Framework中抛出非CLS兼容的exception,只要您使用允许它的语言,例如C ++。
- 不,您不能在C#中抛出非CLS兼容的exception。
- 不,它将捕获所有exception,因为任何非CLS兼容的exception都将包装在
RuntimeWrappedException
,该Exception
派生自Exception
。 -
你不会抛出一个
RuntimeWrappedException
,CLRRuntimeWrappedException
。 MSDN有一个详细的描述,我在这里引用:某些语言(如C ++)允许您抛出任何托管类型的exception。 其他语言(如Microsoft C#和Visual Basic)要求从Exception类派生每个抛出的exception。 为了保持语言之间的兼容性,公共语言运行库(CLR)在RuntimeWrappedException对象中包装不是从Exception派生的对象。
如果要以不同方式处理CLS和非CLSexception,只需按正确的顺序捕获它们:
try { // some code catch(RuntimeWrappedException ex) { // non-CLS exceptions catch(Exception ex) { // CLS exceptions }
尽管C#编译器允许开发人员仅在C#2.0版之前抛出Exception派生的对象,但C#编译器确实允许开发人员通过使用如下代码来捕获非CLS兼容的exception:
private void SomeMethod() { try { // Inside the try block is where you put code requiring // graceful recovery or common cleanup operations. } catch (Exception e) { // Before C# 2.0, this block catches CLS-compliant exceptions only // In C# 2.0, this block catches CLS- & non-CLS- compliant exceptions throw; // Re-throws whatever got caught } catch { // In all versions of C#, this block catches // CLS- & non-CLS- compliant exceptions throw; // Re-throws whatever got caught } }
CLS允许但不是所有语言都可以。 它可以用C ++ / CLI完成,但它不能用C#,VB.NET。
从.Net Framework 2.0开始,所有非CLSexception都包含在RuntimeWrappedException中 。
由于RuntimeWrappedException派生自Exception,因此catch(Exception)将捕获非CLSexception。
从RuntimeWrappedException,您可以通过RuntimeWrappedException.WrappedException属性访问原始exception。