• 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++异常处理。

  • 相关阅读:
    JAVA的中文字符乱码问题
    JAVA SSH 框架介绍
    MySQL必备命令
    java文件操作
    注意事项
    再探java基础——throw与throws
    table与div互相嵌套注意
    数列F[19] + F[13]的值
    统计各类字符个数
    长理ACM 14-星期几(谌海军)
  • 原文地址:https://www.cnblogs.com/revercc/p/14069252.html
Copyright © 2020-2023  润新知