我只想澄清:
我可以在.NET框架中同时抛出符合CLS和非CLS的异常吗?我正在使用C# 3.0。
当我发现一个异常
catch(Exception ex)
{
}发布于 2009-10-07 11:42:50
RuntimeWrappedException中,这是从Exception派生的。RuntimeWrappedException,则CLR会抛出。MSDN有详细的描述,我在这里引用:
某些语言(如C++ )允许您抛出任何托管类型的异常。其他语言(如Microsoft C#和Visual )要求从异常类派生每个引发的异常。为了保持语言之间的兼容性,公共语言运行库(CLR)封装不从RuntimeWrappedException对象中的异常派生的对象。如果您想以不同的方式对待CLS和非CLS异常,只需按正确的顺序捕获它们:
try {
// some code
catch(RuntimeWrappedException ex) {
// non-CLS exceptions
catch(Exception ex) {
// CLS exceptions
}发布于 2009-10-07 11:45:20
尽管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
}
}发布于 2009-10-07 11:48:11
CLS允许它,但并不是所有的语言都允许。它可以用C++/CLI来完成,但不能用C#、VB.NET来完成。
从.Net Framework2.0开始,所有非CLS异常都封装在RuntimeWrappedException中。
由于RuntimeWrappedException是从异常派生的,所以catch (异常)将捕获非CLS异常。
从RuntimeWrappedException中,您可以通过RuntimeWrappedException.WrappedException属性访问原始异常。
https://stackoverflow.com/questions/1531077
复制相似问题