C++编译器怎么实现异常处理

这篇文章主要介绍“C++编译器怎么实现异常处理”,在日常操作中,相信很多人在C++编译器怎么实现异常处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++编译器怎么实现异常处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

成都创新互联-专业网站定制、快速模板网站建设、高性价比延吉网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式延吉网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖延吉地区。费用合理售后完善,十年实体公司更值得信赖。

C++编译器是一个与标准化C++高度兼容的编译环境,其强大的CUP优化功能可以使程序变得非常干净并且容易维护,好了下面就请大家跟随本文一起进入C++编译器的世界吧。

本文讨论了C++编译器如何实现异常处理。我将假定你已经熟悉异常处理的语法和机制。本文还提供了一个用于VC++的异常处理库,要用库中的处理程序替换掉VC++提供的那个,你只需要调用下面这个函数:

struct EXCEPTION_REGISTRATION  {      EXCEPTION_REGISTRATION* prev;      DWORD handler;  };


之后,程序中的所有异常,从它们被抛出到堆栈展开(stack unwinding),再到调用catch块,***到程序恢复正常运行,都将由我的异常处理库来管理与其它C++特性一样,C++标准并没有规定编译器应该如何来实现异常处理。

这意味着每一个C++编译器的提供商都可以用它们认为恰当的方式来实现它。下面我会描述一下VC++是怎么做的,但即使你使用其它的C++编译器或操作系统①,本文也应该会是一篇很好的学习材料。

VC++的实现方式是以windows系统的结构化异常处理(SEH)②为基础的。 结构化异常处理—概述在本文的讨论中,我认为异常或者是被明确的抛出的,或者是由于除零溢出、空指针访问等引起的。

当它发生时会产生一个中断,接下来控制权就会传递到操作系统的手中。操作系统将调用异常处理程序,检查从异常发生位置开始的函数调用序列,进行堆栈展开和控制权转移。Windows定义了结构“EXCEPTION_REGISTRATION”,使我们能够向操作系统注册自己的异常处理程序。

#include    #include     using std::cout;   using std::endl;    struct EXCEPTION_REGISTRATION   {       EXCEPTION_REGISTRATION* prev;       DWORD handler;   };    EXCEPTION_DISPOSITION myHandler(       _EXCEPTION_RECORD *ExcRecord,       void * EstablisherFrame,       _CONTEXT *ContextRecord,       void * DispatcherContext)   {       cout << "In the exception handler" << endl;       cout << "Just a demo. exiting..." << endl;       exit(0);       return ExceptionContinueExecution; //不会运行到这   }    int  g_div = 0;    void bar()   {       //初始化一个EXCEPTION_REGISTRATION结构       EXCEPTION_REGISTRATION reg, *preg = ®        reg.handler = (DWORD)myHandler;        //取得当前异常处理链的“头”       DWORD prev;       _asm       {           mov EAX, FS:[0]           mov prev, EAX       }       reg.prev = (EXCEPTION_REGISTRATION*) prev;        //注册!       _asm       {           mov EAX, preg           mov FS:[0], EAX       }

注意EXCEPTION_REGISTRATION必须定义在栈上,并且必须位于比上一个结点更低的内存地址上,Windows对此有严格要求,达不到的话,它就会立刻终止进程。

到此,关于“C++编译器怎么实现异常处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


网页名称:C++编译器怎么实现异常处理
文章来源:http://scyanting.com/article/jppdgi.html