早上看到一篇別人的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,應該是個好習慣.