Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½âC++ÖеÄÒì³£´¦Àí»úÖÆ
 
À´Ô´£ºÂëÅ©Íø  ·¢²¼ÓÚ£º2017-4-18
  2979  次浏览      27
 

Òì³£´¦Àí

ÔöÇ¿´íÎó»Ö¸´ÄÜÁ¦ÊÇÌá¸ß´úÂ뽡׳ÐÔµÄ×îÓÐÁ¦µÄ;¾¶Ö®Ò»£¬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Ƚϼòµ¥µÄ£¬µ«ÊÇÓô¦»¹ÊǺܴóµÄ£¬¶ÔÓÚ¸³Öµ²Ù×÷·ûÀ´Ëµ£¬ºÜ¶àÇé¿ö¶¼ÊÇÐèÒªÖØÔصģ®

   
2979 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
Öع¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

Öع¹-¸ÄÉƼÈÓдúÂëµÄÉè¼Æ
Èí¼þÖع¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼Æģʽ
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ