C++的try-catch

1.try-catch-throw

在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在任何自己得到不想要的结果的时候进行中断,比如在进行数据库事务操作的时候,如果某一个语句返回SQL_ERROR则直接抛出异常,在catch块中进行事务回滚(回滚怎么理解?))。

#include <iostream> 
#include <exception> 
using namespace std; 
int main () { 
 try 
 { 
  throw 1; 
  throw "error"; 
 } 
 catch(char *str) 
 { 
  cout << str << endl; 
 } 
 catch(int i) 
 { 
  cout << i << endl; 
 } 
}

2.自己定义异常类来进行处理

#include <iostream> 
#include <exception> 
using namespace std; 
 
//可以自己定义Exception 
class myexception: public exception 
{ 
 virtual const char* what() const throw() 
 { 
  return "My exception happened"; 
 } 
}myex; 
 
int main () { 
 try 
 {  
  if(true) //如果,则抛出异常; 
   throw myex; 
 } 
 catch (exception& e) 
 { 
  cout << e.what() << endl; 
 } 
 return 0; 
}
#include <iostream> 
#include <exception> 
using namespace std; 
 
int main () { 
 try 
 { 
  int* myarray= new int[100000]; 
 } 
 catch (exception& e) 
 { 
  cout << "Standard exception: " << e.what() << endl; 
 } 
 return 0; 
}

 catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常对象更好的控制手段,使开发的软件系统有很好的可靠性。因此一个比较有经验的程序员通常会这样组织编写它的代码模块。

3.try finally使用

DWORD Func_SEHTerminateHandle()
{
DWORD dwReturnData = 0;
HANDLE hSem = NULL;
const char* lpSemName = "TermSem";
hSem = CreateSemaphore(NULL, 1, 1, lpSemName);
__try
{
 WaitForSingleObject(hSem,INFINITE);
 dwReturnData = 5;
 return dwReturnData;
}
__finally
{
 ReleaseSemaphore(hSem,1,NULL);
 CloseHandle(hSem);
}
dwReturnData += 5;
return dwReturnData;
}

在try块的末尾增加了一个return语句。这个return语句告诉编译程序在这里要退出这个函数并返回dwTemp变量的内容,现在这个变量的值是5。但是,如果这个return语句被执行,该线程将不会释放信标,其他线程也就不能再获得对信标的控制。可以想象,这样的执行次序会产生很大的问题,那些等待信标的线程可能永远不会恢复执行。通过使用结束处理程序,可以避免return语句的过早执行。当return语句试图退出try块时,编译程序要确保finally块中的代码首先被执行。要保证finally块中的代码在try块中的return语句退出之前执行。在程序中,将ReleaseSemaphore的调用放在结束处理程序块中,保证信标总会被释放。这样就不会造成一个线程一直占有信标,否则将意味着所有其他等待信标的线程永远不会被分配CPU时间。在finally块中的代码执行之后,函数实际上就返回。任何出现在finally块之下的代码将不再执行,因为函数已在try块中返回。所以这个函数的返回值是5,而不是10。

在上面的代码段中,操作系统和编译程序共同来确保结束处理程序中的__f i n a l l y代码块能够被执行,不管保护体(t r y块)是如何退出的。不论你在保护体中使用r e t u r n,还是g o t o,或者是longjump,结束处理程序(f i n a l l y块)都将被调用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值