还是关于异常

Posted on 2006-05-31 11:40 Raistlin 阅读(359) 评论(0)  编辑 收藏 引用 所属分类: C++
早上看到一篇别人的blog,上有如下代码:
try{
   ...
   throw "teststring";//1
}
catch(string & rs){//2
   ...
}
想要用//2处的语句来捕获//1处的异常,当然是不对的.
正确的应该是:
catch(char * ps){ 或 catch(const char * ps){

其实因为"teststring"是保存在代码段中的,所以应该抛出const指针
try{
   ...
   throw static_cast<const char *>("teststring");
}
catch(char * ps){//错,改为=> catch(const char * ps){
   ...
}
天下太平,但如果钻牛角尖:
try{
   ...
   throw static_cast<const char *>("teststring");//3
}
catch(const char * const& rps){//4
   ...
}
可以吗?编译正常,但//4无法捕获//3的异常.
但为什么
try{
   ...
   throw static_cast<const string>string("teststring");//5
}
catch(const string & rs){//6
   ...
}
//6处就可以捕获到//5处的异常呢
因为//5处抛出的异常类型根本就不是const的.只是string的类型
而//3处的异常的类型的确是cosnt char *
嘿嘿...

简单的说异常的处理需要引入一个全局的对象.
throw x;的时候用x来给这个全局对象y赋值,当捕获的时候在catch( type z)处,用y给z赋值.
如果x的类型不是指针(比如string),不管它有没有常量性,y的类型都是string,而z的类型不管是string 还是const string都能捕获x.

但是,当x的类型是指针的时候,y的类型的常量性和x是一致的,z的类型也只有和x一致才能捕获x的异常.

但//4处就是不能捕获//3的异常.
也许是VC++的问题?
不知道别的编译器如何.
还好用引用来捕获指针...普通人应该都不会这么做-_-
但尽量用const类型来catch,应该是个好习惯.


只有注册用户登录后才能发表评论。

posts - 49, comments - 14, trackbacks - 0, articles - 0

Copyright © Raistlin