zoukankan      html  css  js  c++  java
  • C异常处理和C++异常处理的对比

    每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理。这里以MSC编译器为例。

    C异常处理

    #include <Windows.h>
    int main(int argc, char* argv[])
    {
    	_try
    	{
    		_try
    		{
    
    		}
    		_except(EXCEPTION_EXECUTE_HANDLER)
    		{
    
    		}
    	}
    	_finally
    	{
    
    	}
    	return 0;
    }
    

    MSC编译器会为每一个函数设置一个异常处理回调函数,此函数为_except_handlerX()。对于_except()而言,需要判断其括号中函数的返回值,其返回值一般为EXCEPTION_EXECUTE_HANDLER(可以处理此异常),EXCEPTION_COTINUE_SEARCH(不能处理此异常),EXCEPTION_CONTINUE_EXECUTION(此异常已经被处理)。当返回值为EXCEPTION_EXECUTE_HANDLER时就会执行_except()中的异常处理代码,对于_finally而言其内的代码总是会被执行。需要注意的是这几个返回值与我们在SEH异常处理函数的返回值不是一回事。

    C++异常处理

    #include <iostream>
    using namespace std;
    int main(int argc, char* argv[])
    {
    	try
    	{
                throw 1;
    	}
    	catch(int i)
    	{
    
    	}
    	return 0;
    }
    
    

    c++异常处理包括三个关键字try:监视异常,throw:抛出异常,catch:捕获异常。而且C++异常处理只能捕获throw产生的异常,因为throw会在内部调用kernel!RaiseException,并使用0xE06D7363"MSC"作为异常代码。C异常处理可以捕获我们所了解的中断异常,除零异常等异常。

    C++异常处理也会为函数设置一个异常处理回调函数(代理函数),此函数为_CxxFrameHandlerX()。此函数与C异常处理中的异常回调函数_except_handlerX()作用相似,只不过其涉及到对象所以处理更复杂。

    总结

    因为MSC编译器只能为一个函数提供一个异常代理函数(C的_except_handlerX(),C++的_CxxFrameHandlerX()),所以同一个函数中不能同时使用C异常处理和C++异常处理。

  • 相关阅读:
    docker/qemu中是如何对设备管理的
    capacilitys docker中的权限设置 privileged
    比特币的价值
    js连接sqlserver进行查询
    easyUI 添加排序到datagrid
    jquery easyui datagrid 分页 详解
    ASP.net中DateTime获取当前系统时间的大全
    计算数据库中30天以内,30-60天,60-90天,90天以外的数据的个数(用sql实现)
    常用的.net开源项目
    数据库设计三大范式
  • 原文地址:https://www.cnblogs.com/revercc/p/14069252.html
Copyright © 2011-2022 走看看