仅供我澄清:
我可以在.NET Framework中同时抛出CLS-Complaint和非CLS投诉异常吗?。我正在使用C#3.0。
当我遇到异常时
catch(Exception ex)
{
}
答案 0 :(得分:12)
RuntimeWrappedException
中,该Exception
派生自RuntimeWrappedException
。您不会抛出try {
// some code
catch(RuntimeWrappedException ex) {
// non-CLS exceptions
catch(Exception ex) {
// CLS exceptions
}
,CLR会这样做。 MSDN有一个详细的描述,我在这里引用:
某些语言(如C ++)允许您抛出任何托管类型的异常。其他语言(如Microsoft C#和Visual Basic)要求从Exception类派生每个抛出的异常。为了保持语言之间的兼容性,公共语言运行库(CLR)在RuntimeWrappedException对象中包装不是从Exception派生的对象。
如果您想以不同方式处理CLS和非CLS异常,只需按正确顺序捕获它们:
{{1}}
答案 1 :(得分:1)
虽然C#编译器允许开发人员仅在之前抛出Exception派生的对象 C#版本2.0,C#编译器确实允许开发人员捕获非符合CLS的异常 通过使用这样的代码:
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
}
}
答案 2 :(得分:1)
CLS允许但不是所有语言都可以。它可以用C ++ / CLI完成,但不能用C#,VB.NET。
从.Net Framework 2.0开始,所有非CLS异常都包含在RuntimeWrappedException内。
由于RuntimeWrappedException派生自Exception,因此catch(Exception)将捕获非CLS异常。
从RuntimeWrappedException,您可以通过RuntimeWrappedException.WrappedException属性访问原始异常。