请问有没有什么异常catch(Exception ex)无法捕获

lionwys 2007-04-17 07:08:30
如题
...全文
1608 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kong1122 2007-04-18
  • 打赏
  • 举报
回复

try {
//Some code
}
catch (System.Exception ex) {
System.Console.Write("Error!");
}
显然,这条语句捕获的是System.Exception,以及所有继承自它的类。
也就是说,如果你抛出了一个不是继承自System.Exception的对象,该语句就无法捕获。抛出不是异常的异,这种不兼容CLS的事情,可能吗?在1.x当中是可能的。
-------------------------------------------------------------------
在C++当中,我们可以用 throw "Error!" 这样的语句抛出一个字符串;
在IL当中,我们可以用下面的方式,抛出任意形式的异常:
.assembly ThrowerLib { }

.class public Thrower {
.method static public void Start( ) {
ldstr "Oops"
throw
ret
}
}
-----------------------------------------------------------------
在.Net2.0当中,为了确保跨语言的兼容性,CLR会自动将不是继承自System.Exception的异常包裹在RuntimeWrappedException对象中;为了保证和1.x版本的兼容性,.Net 2.0提供了RuntimeCompatibilityAttribute类,指定CLR不要对异常进行包装:[assembly:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]

测试用代码(运行于.Net 2.0):
.assembly ThrowerLib { }

.class public Thrower {
.method static public void ThrowException( ) {
ldstr "ThrowException exception from the IL world!"
newobj instance void [mscorlib]System.Exception::.ctor(string)
throw
ret
}

.method static public void ThrowString( ) {
ldstr "Weird exception!"
throw
ret
}
}

测试用C#代码,要添加对上面的DLL的引用:
[assembly: System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]

namespace ThrowerExample
{
class ThrowerHarness
{
static void Main(string[] args)
{
try
{
Thrower.ThrowException();
}
catch (System.Exception ex)
{
System.Console.WriteLine("System.Exception error: " + ex.Message);
}
catch
{
System.Console.WriteLine("Non System.Exception based error.");
}

try
{
Thrower.ThrowString();
}
catch (System.Exception ex)
{
System.Console.WriteLine("System.Exception error: " + ex.Message);
}
catch
{
System.Console.WriteLine("Non System.Exception based error.");
}
}
}
}

-------------------------------
执行结果是,第一个异常将被catch(System.Exception ex){}捕获;第二个异常由于catch(System.Exception ex){}无法捕获,将落到catch{}中。

如果把第一行的属性去掉,编译时将出现下面的警告:
warning CS1058: A previous catch clause already catches all exceptions. All non-exceptions thrown will be wrapped in a System.Runtime.CompilerServices.RuntimeWrappedException

继续执行的话,两个异常都将被catch(System.Exception ex){}捕获,不会有任何异常落到catch{}当中


lionwys 2007-04-18
  • 打赏
  • 举报
回复
不过到底什么会出现这种异常呢???
lionwys 2007-04-18
  • 打赏
  • 举报
回复
哦,谢谢了
lionwys 2007-04-18
  • 打赏
  • 举报
回复
谢谢,很清楚
路人霆 2007-04-17
  • 打赏
  • 举报
回复
正解
amandag 2007-04-17
  • 打赏
  • 举报
回复
//根据文档记录,C#为我们提供了一种特殊的catch块来捕获与CLS不兼容的异常
//由于不能捕获这样的catch块中的对象,所以我们不能得到所捕获异常的任何信息
catch
{

}

详细内容可参考 .NET框架程序设计

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧