Òì³£´¦Àí
ÔöÇ¿´íÎó»Ö¸´ÄÜÁ¦ÊÇÌá¸ß´úÂ뽡׳ÐÔµÄ×îÓÐÁ¦µÄ;¾¶Ö®Ò»£¬CÓïÑÔÖвÉÓõĴíÎó´¦Àí·½·¨±»ÈÏΪÊǽôñîºÏµÄ£¬º¯ÊýµÄʹÓÃÕß±ØÐëÔڷdz£¿¿½üº¯Êýµ÷Óõĵط½±àд´íÎó´¦Àí´úÂ룬ÕâÑù»áʹµÃÆä±äµÃ±¿×¾ºÍÄÑÒÔʹÓá£C++ÖÐÒýÈëÁËÒì³£´¦Àí»úÖÆ£¬ÕâÊÇC++µÄÖ÷ÒªÌØÕ÷Ö®Ò»£¬ÊÇ¿¼ÂÇÎÊÌâºÍ´¦Àí´íÎóµÄÒ»ÖÖ¸üºÃµÄ·½Ê½¡£Ê¹ÓôíÎó´¦Àí¿ÉÒÔ´øÀ´Ò»Ð©Óŵ㣬ÈçÏÂ:
´íÎó´¦Àí´úÂëµÄ±àд²»ÔÙÈß³¤·¦Î¶£¬²¢ÇÒ²»ÔÙºÍÕý³£µÄ´úÂë»ìºÏÔÚÒ»Æ𣬳ÌÐòÔ±Ö»ÐèÒª±àдϣÍû²úÉúµÄ´úÂ룬ȻºóÔÚºóÃæij¸öµ¥¶ÀµÄÇø¶ÎÀï±àд´¦Àí´íÎóµÄàÇÂ𡣶à´Îµ÷ÓÃͬһ¸öº¯Êý£¬ÔòÖ»ÐèҪij¸öµØ·½±àдһ´Î´íÎó´¦Àí´úÂë¡£
´íÎó²»Äܱ»ºöÂÔ£¬Èç¹ûÒ»¸öº¯Êý±ØÐëÏòµ÷ÓÃÕß·¢ËÍÒ»´Î´íÎóÐÅÏ¢¡£Ëü½«Å׳öÒ»¸öÃèÊöÕâ¸ö´íÎóµÄ¶ÔÏó¡£
´«Í³µÄ´íÎó´¦ÀíºÍÒì³£´¦Àí
ÔÚÌÖÂÛÒì³£´¦Àí֮ǰ£¬ÎÒÃÇÏÈ̸̸CÓïÑÔÖеĴ«Í³´íÎó´¦Àí·½·¨£¬ÕâÀïÁоÙÁËÈçÏÂÈýÖÖ:
ÔÚº¯ÊýÖзµ»Ø´íÎ󣬺¯Êý»áÉèÖÃÒ»¸öÈ«¾ÖµÄ´íÎó״̬±êÖ¾¡£
ʹÓÃÐźÅÀ´×öÐźŴ¦Àíϵͳ£¬ÔÚº¯ÊýÖÐraiseÐźţ¬Í¨¹ýsignalÀ´ÉèÖÃÐźŴ¦Àíº¯Êý£¬ÕâÖÖ·½Ê½ñîºÏ¶È·Ç³£¸ß£¬¶øÇÒ²»Í¬µÄ¿â²úÉúµÄÐźÅÖµ¿ÉÄܻᷢÉú³åÍ»
ʹÓñê×¼C¿âÖеķǾֲ¿Ìøתº¯Êý setjmpºÍlongjmp £¬ÕâÀïʹÓÃsetjmpºÍlongjmpÀ´ÑÝʾÏÂÈçºÎ½øÐдíÎó´¦Àí:
#include <iostream> #include <setjmp.h> jmp_buf static_buf; //ÓÃÀ´´æ·Å´¦ÀíÆ÷ÉÏÏÂÎÄ£¬ÓÃÓÚÌøת
void do_jmp()
{
//do something,simetime occurs a little error
//µ÷ÓÃlongjmpºó£¬»áÔØÈëstatic_bufµÄ´¦ÀíÆ÷ÐÅÏ¢£¬È»ºóµÚ¶þ¸ö²ÎÊý×÷Ϊ·µ»ØµãµÄsetjmpÕâ¸öº¯ÊýµÄ·µ»ØÖµ
longjmp(static_buf,10);//10ÊÇ´íÎóÂ룬¸ù¾ÝÕâ¸ö´íÎóÂëÀ´½øÐÐÏàÓ¦µÄ´¦Àí
}
int main()
{
int ret = 0;
//½«´¦ÀíÆ÷ÐÅÏ¢±£´æµ½static_bufÖÐ,²¢·µ»Ø0£¬Ï൱ÓÚÔÚÕâÀï×öÁËÒ»¸ö±ê¼Ç£¬ºóÃæ¿ÉÒÔÌøת¹ýÀ´
if((ret = setjmp(static_buf)) == 0) {
//ÒªÖ´ÐеĴúÂë
do_jmp();
} else { //³öÏÖÁË´íÎó
if (ret == 10)
std::cout << "a little error"
<< std::endl;
}
} |
´íÎó´¦Àí·½Ê½¿´ÆðÀ´ñîºÏ¶È²»ÊǺܸߣ¬Õý³£´úÂëºÍ´íÎó´¦ÀíµÄ´úÂë·ÖÀëÁË£¬´¦Àí´¦ÀíµÄ´úÂ붼»ã¾ÛÔÚÒ»ÆðÁË¡£µ«ÊÇ»ùÓÚÕâÖÖ¾Ö²¿ÌøתµÄ·½Ê½À´´¦Àí´úÂ룬ÔÚC++ÖÐÈ´´æÔÚºÜÑÏÖصÄÎÊÌ⣬ÄǾÍÊǶÔÏó²»Äܱ»Îö¹¹£¬¾Ö²¿Ìøתºó²»»áÖ÷¶¯È¥µ÷ÓÃÒѾʵÀý»¯¶ÔÏóµÄÎö¹¹º¯Êý¡£Õ⽫µ¼ÖÂÄÚ´æ鶵ÄÎÊÌâ¡£ÏÂÃæÕâ¸öÀý×Ó³ä·ÖÏÔʾÁËÕâµã
#include <iostream> #include <csetjmp>
using namespace std;
class base {
public:
base() {
cout << "base construct func call"
<< endl;
}
~base() {
cout << "~base destruct func call"
<< endl;
}
};
jmp_buf static_buf;
void test_base() {
base b;
//do something
longjmp(static_buf,47);//½øÐÐÁËÌøת£¬Ìøתºó»á·¢ÏÖbÎÞ·¨Îö¹¹ÁË
}
int main() {
if(setjmp(static_buf) == 0) {
cout << "deal with some thing"
<< endl;
test_base();
} else {
cout << "catch a error" <<
endl;
}
} |
ÔÚÉÏÃæÕâ¶Î´úÂëÖУ¬Ö»ÓÐbaseÀàµÄ¹¹Ô캯Êý»á±»µ÷Ó㬵±longjmp·¢ÉúÁËÌøתºó£¬bÕâ¸öʵÀý½«²»»á±»Îö¹¹µô£¬µ«ÊÇÖ´ÐÐÁ÷ÒѾÎÞ·¨»Øµ½ÕâÀbÕâ¸öʵÀý½«²»»á±»Îö¹¹¡£Õâ¾ÍÊǾֲ¿ÌøתÓÃÔÚC++ÖÐÀ´´¦Àí´íÎóµÄʱºò´øÀ´µÄһЩÎÊÌ⣬ÔÚC++ÖÐÒì³£Ôò²»»áÓÐÕâЩÎÊÌâµÄ´æÔÚ¡£ÄÇô½ÓÏÂÀ´¿´¿´ÈçºÎ¶¨ÒåÒ»¸öÒì³££¬ÒÔ¼°ÈçºÎÅ׳öÒ»¸öÒì³£ºÍ²¶»ñÒì³£°É.
Òì³£µÄÅ׳ö
class MyError { const char* const data; public: MyError(const char* const msg = 0):data(msg) { //idle } };
void do_error() {
throw MyError("something bad happend");
}
int main()
{
do_error();
} |
ÉÏÃæµÄÀý×ÓÖУ¬Í¨¹ýthrowÅ׳öÁËÒ»¸öÒì³£ÀàµÄʵÀý£¬Õâ¸öÒì³£À࣬¿ÉÒÔÊÇÈκÎÒ»¸ö×Ô¶¨ÒåµÄÀ࣬ͨ¹ýʵÀý»¯´«ÈëµÄ²ÎÊý¿ÉÒÔ±íÃ÷·¢ÉúµÄ´íÎóÐÅÏ¢¡£ÆäʵÒì³£¾ÍÊÇÒ»¸ö´øÓÐÒì³£ÐÅÏ¢µÄÀà¶øÒÑ¡£Òì³£±»Å׳öºó£¬ÐèÒª±»²¶»ñ£¬´Ó¶ø¿ÉÒÔ´Ó´íÎóÖнøÐлָ´£¬ÄÇô½ÓÏÂÀ´¿´¿´ÈçºÎÈ¥²¶»ñÒ»¸öÒì³£°É¡£ÔÚÉÏÃæÕâ¸öÀý×ÓÖÐʹÓÃÅ׳öÒì³£µÄ·½Ê½À´½øÐдíÎó´¦ÀíÏà±ÈÓë֮ǰʹÓþֲ¿ÌøתµÄʵÏÖÀ´Ëµ£¬×î´óµÄ²»Í¬Ö®´¦¾ÍÊÇÒì³£Å׳öµÄ´úÂë¿éÖУ¬¶ÔÏó»á±»Îö¹¹£¬³Æ֮Ϊ¶ÑÕ»·´½â£®
Òì³£µÄ²¶»ñ
C++ÖÐͨ¹ýcatch¹Ø¼ü×ÖÀ´²¶»ñÒì³££¬²¶»ñÒì³£ºó¿ÉÒÔ¶ÔÒì³£½øÐд¦Àí£¬Õâ¸ö´¦ÀíµÄÓï¾ä¿é³ÆΪÒì³£´¦ÀíÆ÷¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄ²¶»ñÒì³£µÄÀý×Ó:
try{ //do something throw string("this is exception"); } catch(const string& e) { cout << "catch a exception " << e << endl; } |
catchÓеãÏñº¯Êý£¬¿ÉÒÔÓÐÒ»¸ö²ÎÊý£¬throwÅ׳öµÄÒì³£¶ÔÏ󣬽«»á×÷Ϊ²ÎÊý´«µÝ¸øÆ¥Åäµ½µ½catch£¬È»ºó½øÈëÒì³£´¦ÀíÆ÷£¬ÉÏÃæµÄ´úÂë½ö½öÊÇչʾÁËÅ׳öÒ»ÖÖÒì³£µÄÇé¿ö£¬¼ÓÈëtryÓï¾ä¿éÖÐÓпÉÄÜ»áÅ׳ö¶àÖÖÒì³£µÄ£¬ÄÇô¸ÃÈçºÎ´¦ÀíÄØ£¬ÕâÀïÊÇ¿ÉÒÔ½Ó¶à¸öcatchÓï¾ä¿éµÄ£¬Õ⽫µ¼ÖÂÒýÈëÁíÍâÒ»¸öÎÊÌ⣬ÄǾÍÊÇÈçºÎ½øÐÐÆ¥Åä¡£
Òì³£µÄÆ¥Åä
Òì³£µÄÆ¥ÅäÎÒÈÏΪÊÇ·ûºÏº¯Êý²ÎÊýÆ¥ÅäµÄÔÔòµÄ£¬µ«ÊÇÓÖÓÐЩ²»Í¬£¬º¯ÊýÆ¥ÅäµÄʱºò´æÔÚÀàÐÍת»»£¬µ«ÊÇÒì³£Ôò²»È»£¬ÔÚÆ¥Åä¹ý³ÌÖв»»á×öÀàÐ͵Äת»»£¬ÏÂÃæµÄÀý×Ó˵Ã÷ÁËÕâ¸öÊÂʵ:
#include <iostream>
using namespace std;
int main()
{
try{
throw 'a';
}catch(int a) {
cout << "int" << endl;
}catch(char c) {
cout << "char" << endl;
}
} |
ÉÏÃæµÄ´úÂëµÄÊä³ö½á¹ûÊÇchar£¬ÒòΪÅ׳öµÄÒì³£ÀàÐ;ÍÊÇchar£¬ËùÒÔ¾ÍÆ¥Åäµ½Á˵ڶþ¸öÒì³£´¦ÀíÆ÷¡£¿ÉÒÔ·¢ÏÖÔÚÆ¥Åä¹ý³ÌÖÐûÓз¢ÉúÀàÐ͵Äת»»¡£½«charת»»Îªint¡£¾¡¹ÜÒì³£´¦ÀíÆ÷²»×öÀàÐÍת»»£¬µ«ÊÇ»ùÀà¿ÉÒÔÆ¥Åäµ½ÅÉÉúÀàÕâ¸öÔÚº¯ÊýºÍÒ쳣ƥÅäÖж¼ÊÇÓÐЧµÄ£¬µ«ÊÇÐèҪעÒâcatchµÄÐβÎÐèÒªÊÇÒýÓÃÀàÐÍ»òÕßÊÇÖ¸ÕëÀàÐÍ£¬·ñÔò»á
µ¼ÖÂÇиîÅÉÉúÀàÕâ¸öÎÊÌâ¡£
//»ùÀà class Base{ public: Base(string msg):m_msg(msg) { } virtual void what(){ cout << m_msg << endl; } void test() { cout << "I am a CBase" << endl; } protected: string m_msg; }; //ÅÉÉúÀ࣬ÖØÐÂʵÏÖÁËÐ麯Êý class CBase : public Base { public: CBase(string msg):Base(msg) {
}
void what()
{
cout << "CBase:" << m_msg
<< endl;
}
};
int main()
{
try {
//do some thing
//Å׳öÅÉÉúÀà¶ÔÏó
throw CBase("I am a CBase exception");
}catch(Base& e) { //ʹÓûùÀà¿ÉÒÔ½ÓÊÕ
e.what();
}
} |
ÉÏÃæµÄÕâ¶Î´úÂë¿ÉÒÔÕý³£µÄ¹¤×÷£¬Êµ¼ÊÉÏÎÒÃÇÈÕ³£±àд×Ô¼ºµÄÒì³£´¦Àíº¯ÊýµÄʱºòÒ²ÊÇͨ¹ý¼Ì³Ð±ê×¼Òì³£À´ÊµÏÖ×Ö½ÚµÄ×Ô¶¨ÒåÒì³£µÄ£¬µ«ÊÇÈç¹û½«Base&»»³ÉBaseµÄ»°£¬½«»áµ¼Ö¶ÔÏó±»ÇиÀýÈçÏÂÃæÕâ¶Î´úÂ뽫»á±àÒë³ö´í£¬ÒòΪCBase±»ÇиîÁË£¬µ¼ÖÂCBaseÖеÄtestº¯ÊýÎÞ·¨±»µ÷Óá£
try { //do some thing throw CBase("I am a CBase exception");
}catch(Base e) {
e.test();
} |
µ½´ËΪ´Ë£¬Òì³£µÄÆ¥ÅäËãÊÇ˵Çå³þÁË£¬×ܽáһϣ¬Ò쳣ƥÅäµÄʱºò»ù±¾ÉÏ×ñÑÏÂÃ漸Ìõ¹æÔò:
Ò쳣ƥÅä³ýÁ˱ØÐëÒªÊÇÑϸñµÄÀàÐÍÆ¥ÅäÍ⣬»¹Ö§³ÖÏÂÃ漸¸öÀàÐÍת»»£®
ÔÊÐí·Ç³£Á¿µ½³£Á¿µÄÀàÐÍת»»£¬Ò²¾ÍÊÇ˵¿ÉÒÔÅ׳öÒ»¸ö·Ç³£Á¿ÀàÐÍ£¬È»ºóʹÓÃcatch²¶×½¶ÔÓ¦µÄ³£Á¿ÀàÐÍ°æ±¾
ÔÊÐí´ÓÅÉÉúÀൽ»ùÀàµÄÀàÐÍת»»
ÔÊÐíÊý×鱻ת»»ÎªÊý×éÖ¸Õ룬ÔÊÐíº¯Êý±»×ª»»Îªº¯ÊýÖ¸Õë
¼ÙÏëÒ»ÖÖÇé¿ö£¬µ±ÎÒҪʵÏÖÒ»´ú´úÂëµÄʱºò£¬Ï£ÍûÎÞÂÛÅ׳öʲôÀàÐ͵ÄÒì³£ÎÒ¶¼¿ÉÒÔ²¶×½µ½£¬Ä¿Ç°À´ËµÎÒÃÇÖ»ÄÜдÉÏÒ»´ó¶ÑµÄcatchÓï¾ä²¶»ñËùÓпÉÄÜÔÚ´úÂëÖгöÏÖµÄÒì³£À´½â¾öÕâ¸öÎÊÌ⣬ºÜÏÔÈ»ÕâÑù´¦ÀíÆðÀ´Ì«¹ý·±Ëö£¬ÐÒºÃC++ÌṩÁËÒ»ÖÖ¿ÉÒÔ²¶×½ÈκÎÒì³£µÄ»úÖÆ£¬¿ÉÒÔʹÓÃÏÂÁдúÂëÖеÄÓï·¨¡£
catch(...) { //Òì³£´¦ÀíÆ÷£¬ÕâÀï¿ÉÒÔ²¶×½ÈκÎÒì³££¬´øÀ´µÄÎÊÌâ¾ÍÊÇÎÞ·¨»òÕßÒì³£ÐÅÏ¢ } |
Èç¹ûÄãҪʵÏÖÒ»¸öº¯Êý¿â£¬Ä㲶׽ÁËÄãµÄº¯Êý¿âÖеÄһЩÒì³££¬µ«ÊÇÄãÖ»ÊǼǼÈÕÖ¾£¬²¢²»È¥´¦ÀíÕâЩÒì³££¬´¦ÀíÒì³£µÄÊÂÇé»á½»¸øÉϲãµ÷ÓõĴúÂëÀ´´¦Àí£®¶ÔÓÚÕâÑùµÄÒ»¸ö³¡¾°C++Ò²ÌṩÁËÖ§³Ö£®
try{ throw Exception("I am a exception"); }catch(...) { //log the exception throw; } |
ͨ¹ýÔÚcatchÓï¾ä¿éÖмÓÈëÒ»¸öthrow£¬¾Í¿ÉÒ԰ѵ±Ç°²¶»ñµ½µÄÒì³£ÖØÐÂÅ׳ö£®ÔÚÒì³£Å׳öµÄÄÇÒ»½ÚÖУ¬ÎÒÔÚ´úÂëÖÐÅ׳öÁËÒ»¸öÒì³££¬µ«ÊÇÎÒûÓÐʹÓÃÈκÎcatchÓï¾äÀ´²¶»ñÎÒÅ׳öµÄÕâ¸öÒì³££¬Ö´ÐÐÉÏÃæµÄ³ÌÐò»á³öÏÖÏÂÃæµÄ½á¹û£®
terminate called after throwing an instance of 'MyError' Aborted (core dumped) |
Ϊʲô»á³öÏÖÕâÑùµÄ½á¹ûÄØ?£¬µ±ÎÒÃÇÅ׳öÒ»¸öÒì³£µÄʱºò£¬Òì³£»áËæן¯Êýµ÷ÓùØϵ£¬Ò»¼¶Ò»¼¶ÏòÉÏÅ׳ö£¬Ö±µ½±»²¶»ñ²Å»áÍ£Ö¹£¬Èç¹û×îÖÕûÓб»²¶»ñ½«»áµ¼Öµ÷ÓÃterminateº¯Êý£¬ÉÏÃæµÄÊä³ö¾ÍÊÇ×Ô¶¯µ÷ÓÃterminateº¯Êýµ¼Öµģ¬ÎªÁ˱£Ö¤¸ü´óµÄÁé»îÐÔ£¬C++ÌṩÁËset_terminateº¯Êý¿ÉÒÔÓÃÀ´ÉèÖÃ×Ô¼ºµÄterminateº¯Êý£®ÉèÖÃÍê³Éºó£¬Å׳öµÄÒì³£Èç¹ûûÓб»²¶»ñ¾Í»á±»×Ô¶¨ÒåµÄterminateº¯Êý½øÐд¦Àí£®ÏÂÃæÊÇÒ»¸öʹÓõÄÀý×Ó:
#include <exception> #include <iostream> #include <cstdlib> using namespace std;
class MyError {
const char* const data;
public:
MyError(const char* const msg = 0):data(msg)
{
//idle
}
};
void do_error() {
throw MyError("something bad happend");
}
//×Ô¶¨ÒåµÄterminateº¯Êý£¬º¯ÊýÔÐÍÐèÒªÒ»ÖÂ
void terminator()
{
cout << "I'll be back" <<
endl;
exit(0);
}
int main()
{
//ÉèÖÃ×Ô¶¨ÒåµÄterminate£¬·µ»ØµÄÊÇÔÓеÄterminateº¯ÊýÖ¸Õë
void (*old_terminate)() = set_terminate(terminator);
do_error();
}
ÉÏÃæµÄ´úÂë»áÊä³öI'll be back |
µ½´ËΪ´Ë¹ØÓÚÒ쳣ƥÅäµÄÎÒËùÖªµÀµÄ֪ʶµã¶¼ÒѾ½éÉÜÍê±ÏÁË£¬ÄÇô½Ó×Å¿ÉÒÔ¿´¿´ÏÂÒ»¸ö»°Ì⣬Òì³£ÖеÄ×ÊÔ´ÇåÀí£®
Òì³£ÖеÄ×ÊÔ´ÇåÀí
ÔÚ̸µ½¾Ö²¿ÌøתµÄʱºò£¬Ëµµ½¾Ö²¿µ÷ת²»»áµ÷ÓöÔÏóµÄÎö¹¹º¯Êý£¬»áµ¼ÖÂÄÚ´æ鶵ÄÎÊÌ⣬C++ÖеÄÒì³£Ôò²»»áÓÐÕâ¸öÎÊÌ⣬C++ÖÐͨ¹ý¶ÑÕ»·´½â½«ÒѾ¶¨ÒåµÄ¶ÔÏó½øÐÐÎö¹¹£¬µ«ÊÇÓÐÒ»¸öÀýÍâ¾ÍÊǹ¹Ô캯ÊýÖÐÈç¹û³öÏÖÁËÒì³££¬ÄÇôÕâ»áµ¼ÖÂÒѾ·ÖÅäµÄ×ÊÔ´ÎÞ·¨»ØÊÕ£¬ÏÂÃæÊÇÒ»¸ö¹¹Ô캯ÊýÅ׳öÒì³£µÄÀý×Ó:
#include <iostream> #include <string> using namespace std;
class base
{
public:
base()
{
cout << "I start to construct"
<< endl;
if (count == 3) //¹¹ÔìµÚËĸöµÄʱºòÅ׳öÒì³£
throw string("I am a error");
count++;
}
~base()
{
cout << "I will destruct " <<
endl;
}
private:
static int count;
};
int base::count = 0;
int main()
{
try{
base test[5];
} catch(...){
cout << "catch some error" <<
endl;
}
}
ÉÏÃæµÄ´úÂëÊä³ö½á¹ûÊÇ:
I start to construct
I start to construct
I start to construct
I start to construct
I will destruct
I will destruct
I will destruct
catch some error |
ÔÚÉÏÃæµÄ´úÂëÖй¹Ô캯Êý·¢ÉúÁËÒì³££¬µ¼Ö¶ÔÓ¦µÄÎö¹¹º¯ÊýûÓÐÖ´ÐУ¬Òò´Ëʵ¼Ê±à³Ì¹ý³ÌÖÐÓ¦¸Ã±ÜÃâÔÚ¹¹Ô캯ÊýÖÐÅ׳öÒì³££¬Èç¹ûûÓа취±ÜÃ⣬ÄÇôһ¶¨ÒªÔÚ¹¹Ô캯ÊýÖжÔÆä½øÐⶻñ½øÐд¦Àí£®×îºó½éÉÜÒ»¸ö֪ʶµã¾ÍÊǺ¯ÊýtryÓï¾ä¿é£¬Èç¹ûmainº¯Êý¿ÉÄÜ»áÅ׳öÒì³£¸ÃÔõô²¶»ñ?£¬Èç¹û¹¹Ô캯ÊýÖеijõʼ»¯Áбí¿ÉÄÜ»áÅ׳öÒì³£¸ÃÔõô²¶»ñ?ÏÂÃæµÄÁ½¸öÀý×Ó˵Ã÷Á˺¯ÊýtryÓï¾ä¿éµÄÓ÷¨:
#include <iostream>
using namespace std;
int main() try {
throw "main";
} catch(const char* msg) {
cout << msg << endl;
return 1;
}
mainº¯ÊýÓï¾ä¿é£¬¿ÉÒÔ²¶»ñmainº¯ÊýÖÐÅ׳öµÄÒì³££®
class Base
{
public:
Base(int data,string str)try:m_int(data),m_string(str)//¶Ô³õʼ»¯ÁбíÖпÉÄÜ»á³öÏÖµÄÒì³£Ò²»á½øÐв¶×½
{
// some initialize opt
}catch(const char* msg) {
cout << "catch a exception"
<< msg << endl;
}
private:
int m_int;
string m_string;
};
int main()
{
Base base(1,"zhangyifei");
} |
ÉÏÃæ˵Á˺ܶ඼ÊǹØÓÚÒì³£µÄʹÓã¬ÈçºÎ¶¨Òå×Ô¼ºµÄÒì³££¬±àдÒì³£ÊÇ·ñÓ¦¸Ã×ñÑÒ»¶¨µÄ±ê×¼£¬ÔÚÄÄÀïʹÓÃÒì³££¬Òì³£ÊÇ·ñ°²È«µÈµÈһϵÁеÄÎÊÌ⣬ÏÂÃæ»áÒ»Ò»ÌÖÂ۵ģ®
±ê×¼Òì³£
C++±ê×¼¿â¸øÎÒÃÇÌṩÁËһϵÁеıê×¼Òì³££¬ÕâЩ±ê×¼Òì³£¶¼ÊÇ´ÓexceptionÀàÅÉÉú¶øÀ´£¬Ö÷Òª·ÖΪÁ½´óÅÉÉúÀ࣬һÀàÊÇlogic_error£¬ÁíÒ»ÀàÔòÊÇruntime_errorÕâÁ½¸öÀàÔÚstdexceptÍ·ÎļþÖУ¬Ç°ÕßÖ÷ÒªÊÇÃèÊö³ÌÐòÖгöÏÖµÄÂß¼´íÎó£¬ÀýÈç´«µÝÁËÎÞЧµÄ²ÎÊý£¬ºóÕßÖ¸µÄÊÇÄÇЩÎÞ·¨Ô¤ÁϵÄʼþËùÔì³ÉµÄ´íÎó£¬ÀýÈçÓ²¼þ¹ÊÕÏ»òÄÚ´æºÄ¾¡µÈ£¬ÕâÁ½Õ߶¼ÌṩÁËÒ»¸ö²ÎÊýÀàÐÍΪstd::stringµÄ¹¹Ô캯Êý£¬ÕâÑù¾Í¿ÉÒÔ½«Òì³£ÐÅÏ¢±£´æÆðÀ´£¬È»ºóͨ¹ýwhat³ÉÔ±º¯ÊýµÃµ½Òì³£ÐÅÏ¢£®
#include <stdexcept> #include <iostream> #include <string> using namespace std;
class MyError:public runtime_error {
public:
MyError(const string& msg = "")
: runtime_error(msg) {}
};
//runtime_error logic_error Á½¸ö¶¼ÊǼ̳Ð×Ô±ê×¼Òì³££¬´øÓÐstring¹¹Ô캯Êý
//
int main()
{
try {
throw MyError("my message");
} catch(MyError& x) {
cout << x.what() << endl;
}
} |
Òì³£¹æ¸ñ˵Ã÷
¼ÙÉèÒ»¸öÏîÄ¿ÖÐʹÓÃÁËһЩµÚÈý·½µÄ¿â£¬ÄÇôµÚÈý·½¿âÖеÄһЩº¯Êý¿ÉÄÜ»áÅ׳öÒì³££¬µ«ÊÇÎÒÃDz»Çå³þ£¬ÄÇôC++ÌṩÁËÒ»¸öÓï·¨£¬½«Ò»¸öº¯Êý¿ÉÄÜ»áÅ׳öµÄÒì³£ÁгöÀ´£¬ÕâÑùÎÒÃÇÔÚ±àд´úÂëµÄʱºò²Î¿¼º¯ÊýµÄÒ쳣˵Ã÷¼´¿É£¬µ«ÊÇC++11ÖÐÕâÖÐÒì³£¹æ¸ñ˵Ã÷µÄ·½°¸ÒѾ±»È¡ÏûÁË£¬ËùÒÔÎÒ²»´òËã¹ý¶à½éÉÜ£¬Í¨¹ýÒ»¸öÀý×Ó¿´¿´Æä»ù±¾Ó÷¨¼´¿É£¬Öص㿴¿´C++11ÖÐÌṩµÄÒ쳣˵Ã÷·½°¸:
#include <exception> #include <iostream> #include <cstdio> #include <cstdlib> using namespace std;
class Up{};
class Fit{};
void g();
//Òì³£¹æ¸ñ˵Ã÷£¬fº¯ÊýÖ»ÄÜÅ׳öUp ºÍFitÀàÐ͵ÄÒì³£
void f(int i)throw(Up,Fit) {
switch(i) {
case 1: throw Up();
case 2: throw Fit();
}
g();
}
void g() {throw 47;}
void my_ternminate() {
cout << "I am a ternminate" <<
endl;
exit(0);
}
void my_unexpected() {
cout << "unexpected exception thrown"
<< endl;
// throw Up();
throw 8;
//Èç¹ûÔÚunexpectedÖмÌÐøÅ׳öÒì³££¬Å׳öµÄÊǹæ¸ñ˵Ã÷Öеġ¡Ôò»á±»²¶×½³ÌÐò¼ÌÐøÖ´ÐÐ
//Èç¹ûÅ׳öµÄÒì³£²»ÔÚÒì³£¹æ¸ñ˵Ã÷ÖзÖÁ½ÖÖÇé¿ö
//1.Òì³£¹æ¸ñ˵Ã÷ÖÐÓÐbad_exception £¬ÄÇô»áµ¼ÖÂÅ׳öÒ»¸öbad_exception
//2.Òì³£¹æ¸ñ˵Ã÷ÖÐûÓÐbad_exception ÄÇô»áµ¼Ö³ÌÐòµ÷ÓÃternminateº¯Êý
// exit(0);
}
int main() {
set_terminate(my_ternminate);
set_unexpected(my_unexpected);
for(int i = 1;i <=3;i++)
{
//µ±Å׳öµÄÒì³£,²¢²»ÊÇÒì³£¹æ¸ñ˵Ã÷ÖеÄÒ쳣ʱ
//»áµ¼ÖÂ×îÖÕµ÷ÓÃϵͳµÄunexpectedº¯Êý£¬Í¨¹ýset_unexpected¿ÉÒÔ
//ÓÃÀ´ÉèÖÃ×Ô¼ºµÄunexpectedº¹º¯Êý
try {
f(i);
}catch(Up) {
cout << "Up caught" << endl;
}catch(Fit) {
cout << "Fit caught" <<
endl;
}catch(bad_exception) {
cout << "bad exception" <<
endl;
}
}
}
}
|
ÉÏÃæµÄ´úÂë˵Ã÷ÁËÒì³£¹æ¸ñ˵Ã÷µÄ»ù±¾Óï·¨£¬ÒÔ¼°unexpectedº¯ÊýµÄ×÷Óã¬ÒÔ¼°ÈçºÎ×Ô¶¨Òå×Ô¼ºµÄunexpectedº¯Êý£¬»¹ÌÖÂÛÁËÔÚunexpectedº¯ÊýÖмÌÐøÅ׳öÒì³£µÄÇé¿öÏ£¬¸ÃÈçºÎ´¦ÀíÅ׳öµÄÒì³£.C++11ÖÐÈ¡ÏûÁËÕâÖÖÒì³£¹æ¸ñ˵Ã÷£®ÒýÈëÁËÒ»¸önoexceptº¯Êý£¬ÓÃÓÚ±íÃ÷Õâ¸öº¯ÊýÊÇ·ñ»áÅ׳öÒì³£
void recoup(int) noexecpt(true); //recoup²»»áÅ׳öÒì³£ void recoup(int) noexecpt(false); //recoup¿ÉÄÜ»áÅ׳öÒì³£ |
´ËÍ⻹ÌṩÁËnoexecptÓÃÀ´¼ì²âÒ»¸öº¯ÊýÊÇ·ñ²»Å׳öÒì³££®
Òì³£°²È«
Òì³£°²È«ÎÒ¾õµÃÊÇÒ»¸öͦ¸´Ôӵĵ㣬²»¹â¹âÐèҪʵÏÖº¯ÊýµÄ¹¦ÄÜ£¬»¹Òª±£´æº¯Êý²»»áÔÚÅ׳öÒì³£µÄÇé¿öÏ£¬³öÏÖ²»Ò»ÖµÄ״̬£®ÕâÀï¾ÙÒ»¸öÀý×Ó£¬´ó¼ÒÔÚʵÏÖ¶ÑÕ»µÄʱºò¾³£¿´µ½ÊéÖеÄÀý×Ó¶¼ÊǶ¨ÒåÁËÒ»¸ötopº¯ÊýÓÃÀ´»ñµÃÕ»¶¥ÔªËØ£¬»¹ÓÐÒ»¸ö·µ»ØÖµÊÇvoidµÄpopº¯Êý½ö½öÖ»ÊÇ°ÑÕ»¶¥ÔªËص¯³ö£¬ÄÇôΪʲôûÓÐÒ»¸öpopº¯Êý¿ÉÒÔ
¼´µ¯³öÕ»¶¥ÔªËØ£¬²¢ÇÒ»¹¿ÉÒÔ»ñµÃÕ»¶¥ÔªËØÄØ?
template<typename T> T stack<T>::pop() { if(count == 0) throw logic_error("stack underflow"); else return data[--count]; } |
Èç¹ûº¯ÊýÔÚ×îºóÒ»ÐÐÅ׳öÁËÒ»¸öÒì³££¬ÄÇôÕâµ¼ÖÂÁ˺¯ÊýûÓн«ÍËÕ»µÄÔªËØ·µ»Ø£¬µ«ÊÇCountÒѾ¼õ£±ÁË£¬ËùÒÔº¯ÊýÏ£ÍûµÃµ½µÄÕ»¶¥ÔªËضªÊ§ÁË£®±¾ÖÊÔÒòÊÇÒòΪÕâ¸öº¯ÊýÊÔͼһ´Î×öÁ½¼þÊ£¬1.·µ»ØÖµ£¬2.¸Ä±ä¶ÑÕ»µÄ״̬£®×îºÃ½«ÕâÁ½¸ö¶ÀÁ¢µÄ¶¯×÷·Åµ½Á½¸ö¶ÀÁ¢µÄº¯ÊýÖÐ,×ñÊØÄÚ¾ÛÉè¼ÆµÄÔÔò£¬Ã¿Ò»¸öº¯ÊýÖ»×öÒ»¼þÊ£®ÎÒÃÇ
ÔÙÀ´ÌÖÂÛÁíÍâÒ»¸öÒì³£°²È«µÄÎÊÌ⣬¾ÍÊǺܳ£¼ûµÄ¸³Öµ²Ù×÷·ûµÄд·¨£¬ÈçºÎ±£Ö¤¸³Öµ²Ù×÷ÊÇÒì³£°²È«µÄ£®
class Bitmap {...}; class Widget { ... private: Bitmap *pb;
};
Widget& Widget::operator=(const Widget&
rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
} |
ÉÏÃæµÄ´úÂë²»¾ß±¸×ÔÎÒ¸³Öµ°²È«ÐÔ£¬ÌÈÈôrhs¾ÍÊǶÔÏó±¾Éí£¬ÄÇô½«»áµ¼ÖÂ*rhs.pbÖ¸ÏòÒ»¸ö±»É¾³ýÁ˵ĶÔÏó£®ÄÇô¾ÍÐ÷¸Ä½øÏ£®¼ÓÈë֤ͬÐÔ²âÊÔ£®
Widget& Widget::operator=(const Widget& rhs) { If(this == rhs) return *this; //֤ͬÐÔ²âÊÔ delete pb; pb = new Bitmap(*rhs.pb); return *this; } |
µ«ÊÇÏÖÔÚÉÏÃæµÄ´úÂëÒÀ¾É²»·ûºÏÒì³£°²È«ÐÔ£¬ÒòΪÈç¹ûdelete pbÖ´ÐÐÍê³ÉºóÔÚÖ´ÐÐnew BitmapµÄʱºò³öÏÖÁËÒì³££¬Ôò»áµ¼ÖÂ×îÖÕÖ¸ÏòÒ»¿é±»É¾³ýµÄÄڴ森ÏÖÔÚÖ»ÒªÉÔ΢¸Ä±äһϣ¬¾Í¿ÉÒÔÈÃÉÏÃæµÄ´úÂë¾ß±¸Òì³£°²È«ÐÔ£®
Widget& Widget::operator=(const Widget& rhs) { If(this == rhs) return *this; //֤ͬÐÔ²âÊÔ Bitmap *pOrig = pb; pb = new Bitmap(*rhs.pb); //ÏÖÔÚÕâÀTʹ·¢ÉúÁËÒì³££¬Ò²²»»áÓ°ÏìthisÖ¸ÏòµÄ¶ÔÏó delete pOrig; return *this; } |
Õâ¸öÀý×Ó¿´ÆðÀ´»¹ÊDZȽϼòµ¥µÄ£¬µ«ÊÇÓô¦»¹ÊǺܴóµÄ£¬¶ÔÓÚ¸³Öµ²Ù×÷·ûÀ´Ëµ£¬ºÜ¶àÇé¿ö¶¼ÊÇÐèÒªÖØÔصģ® |