【发布时间】:2023-04-01 12:54:01
【问题描述】:
只是为了我的澄清:
我能否在 .NET Framework 中同时抛出符合 CLS 和不符合 CLS 的异常?我正在使用 C# 3.0。
当我发现异常时
catch(Exception ex)
{
}
- 它会只捕获符合 CLS 的异常吗?
- RuntimeWrappedException 类有什么用(可以举个简单的例子吗?)。
【问题讨论】:
只是为了我的澄清:
我能否在 .NET Framework 中同时抛出符合 CLS 和不符合 CLS 的异常?我正在使用 C# 3.0。
当我发现异常时
catch(Exception ex)
{
}
【问题讨论】:
Exception 的 RuntimeWrappedException 中。您不会抛出RuntimeWrappedException,CLR 会。 MSDN有详细的描述,我在这里引用:
某些语言(例如 C++)允许您抛出任何托管类型的异常。其他语言(如 Microsoft C# 和 Visual Basic)要求每个引发的异常都派生自 Exception 类。为了保持语言之间的兼容性,公共语言运行时 (CLR) 将不是从 Exception 派生的对象包装在 RuntimeWrappedException 对象中。
如果您想区别对待 CLS 和非 CLS 异常,只需按正确的顺序捕获它们即可:
try {
// some code
catch(RuntimeWrappedException ex) {
// non-CLS exceptions
catch(Exception ex) {
// CLS exceptions
}
【讨论】:
虽然 C# 编译器只允许开发人员抛出异常派生的对象,但在 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
}
}
【讨论】:
CLS 允许,但并非所有语言都允许。可以使用 C++/CLI 完成,但不能使用 C#、VB.NET。
从 .Net Framework 2.0 开始,所有非 CLS 异常都包装在 RuntimeWrappedException 中。
由于 RuntimeWrappedException 派生自 Exception,所以一个 catch (Exception) 将捕获非 CLS 异常。
您可以通过 RuntimeWrappedException.WrappedException 属性从 RuntimeWrappedException 访问原始异常。
【讨论】: