异常学习

本文通过C++示例代码展示了如何使用set_terminate处理未被捕获的异常,并探讨了异常在对象构造及析构过程中的行为特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <exception>
#include 
<iostream>
using namespace std;
 
void terminator() {
  cout 
<< "I'll be back!" << endl;
  exit(
0);
}

 
void (*old_terminate)() = set_terminate(terminator);
 
class Botch {
public:
  
class Fruit {};
  
void f() {
    cout 
<< "Botch::f()" << endl;
    
throw Fruit();
  }

  
~Botch() throw 'c'; }
}
;
 
int main() {
  
try {
    Botch b;
    b.f();
  }
 catch(...) {
    cout 
<< "inside catch(...)" << endl;
  }

}
 ///:~
 
    没catch的异常可以用set_terminate来处理。同时,可以看出在析构函数里抛异常是很郁闷的一件事情。


如果在生成对象时候产生异常,会自己析购已经生成的,而产生异常的那一次生成,没有调用析构函数。
//: C01:Cleanup.cpp
// Exceptions clean up complete objects only.
#include <iostream>
using namespace std;
 
class Trace {
  
static int counter;
  
int objid;
public:
  Trace() 
{
    objid 
= counter++;
    cout 
<< "constructing Trace #" << objid << endl;
    
if(objid == 3throw 3;
  }

  
~Trace() {
    cout 
<< "destructing Trace #" << objid << endl;
  }

}
;
 
int Trace::counter = 0;
 
int main() {
  
try {
    Trace n1;
    
// Throws exception:
    Trace array[5];
    Trace n2;  
// Won't get here.
  }
 catch(int i) {
    cout 
<< "caught " << i << endl;
  }

}
 ///:~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值