精华内容
下载资源
问答
  • C++的Exception的中文翻译“异常”决定了它的主要用途必然是用于错误处理;确切的说,是为处理当前模块无法处理的情况而把处理权交给上一层模块。不过,当然不能被这个词语所局限。抛出Exception的不一定是异常的...

    终于放假了,而我的csdn博客也是长期没有整理。最近我常常考虑异常的问题,所以今天的时候我探究了一下c++究竟是怎么实现异常的。写完这篇之后,我感觉我对异常的了解更深了。

    C++Exception的中文翻译“异常”决定了它的主要用途必然是用于错误处理;确切的说,是为处理当前模块无法处理的情况而把处理权交给上一层模块。不过,当然不能被这个词语所局限。抛出Exception的不一定是异常的状况。有的时候我们会遇到这种情况:一个函数可能需要根据不同情况返回多种不同类型的值、或者一个函数可能需要或可能不需要返回值。利用Exception可以优雅地解决这些问题。标准情况只有一个返回方法(return关键字),而Exception可以提供另一种更加灵活的返回方法。

    之所以Exception适用于错误处理,是因为错误本身是不同于函数本身返回值类型的返回值。

    /*******************************************

    <Author>Bowen YU</Author>

    <Describe>

    Bank System: My Program for CPP Examination

    Demonstrating an uncommon use of exception

    </Describe>

    <Todo></Todo>

    *******************************************/

    #include "Account.h"

    #include "Ui.h"

    #include <iostream>

    using namespace std;

     

    int main(void)

    {

        try{

            for(;;)

            {

                display_Main();

                dologic_Main();

            }

        }catch(ExceptionQuit)

        {

        }

        return 0;

    }

    以上代码是我在C++考试写的一个命令行交互程序,本来需要一个标志exit来标记是否退出,并且每次for循环的时候都需要判断是否exit。我写的这段代码则避免了繁琐,写得很简洁。

    /*******************************************

    <Author>Bowen YU</Author>

    <Describe>

    A Simple Program Demonstrating The Use of Exception

    </Describe>

    <Todo></Todo>

    *******************************************/

     

    class ExceptionSimple { };

     

    int f(bool p)

    {

        if(p)

        {

            throwExceptionSimple();

        }

        else

        {

            return0;

        }

    }

     

    int main(void)

    {

        try

        {

            f(false);

            f(true);

        }

        catch(ExceptionSimplees)

        {

            __asm__("nop;nop; nop;");

        }

       

        return 0;

    }

    其中main的汇编代码,注意到LEHB0LEHE0包含了try块里面的代码。

    LEHB0:

    call    __Z1fb  //f(0);

        movl    $1, (%esp)

        call    __Z1fb  //f(1);

    LEHE0:

    L7:

        movl    $0, %eax //return 0;

        leave

    ret

    f的汇编代码,cxa_allocate_exception(1)给抛出的对象分配内存,而cxa_throw(0,&_ZTI15ExceptionSimple,%eax)抛出异常。

        pushl   %ebp

        movl        %esp,%ebp

        subl        $40,%esp

        movl        8(%ebp),%eax

        movb        %al,-12(%ebp)

        cmpb        $0,-12(%ebp)

        je      L2

        movl        $1,(%esp)

        call        cxa_allocate_exception

        movl        $0, 8(%esp)

        movl        $ZTI15ExceptionSimple,4(%esp)

        movl        %eax,(%esp)

        call        cxa_throw

    L2:

        movl        $0,%eax

        leave

        ret

    异常处理代码

    L8:

    cmpl        $1,%edx

        je      L6

        movl        %eax,(%esp)

        call        Unwind_Resume

    L6:

        movl        %eax,(%esp)

        call        cxa_begin_catch

        nop; nop;nop;

        call        cxa_end_catch

        jmp     L7

    L7:

        movl        $0,%eax  //return 0; of main()

        leave

        ret

    Exception Table

    .section    .gcc_except_table,"w"

    .align 4

        .uleb128LEHB0-LFB1

        .uleb128LEHE0-LEHB0

        .uleb128L8-LFB1

    _ ZTS15ExceptionSimple记录了异常名,是个字符串。

    _ZTI15ExceptionSimple是个结构体,分别包含一个int和一个char*。其中int型的__ZTVN10__cxxabiv117__class_type_infoE+8应该可以推测类的信息。

    __ZTI15ExceptionSimple:

        .long   __ZTVN10__cxxabiv117__class_type_infoE+8

        .long   __ZTS15ExceptionSimple

    __ZTS15ExceptionSimple:

        .ascii"15ExceptionSimple\0"

    由上面所给出的材料可以得出的一些结论:

    1.        MinGW实现异常机制的时候引入了“异常表”(Exception Table),抛出异常之后会在异常表内寻找异常处理程序的位置。并且这里被抛出的对象在运行期不仅仅具有值,还有表示其类型的唯一标识符和显示名(见ZTS15ExceptionSimple),与通常时候类型信息仅仅在编译期存在的观念不一样(与此类比的是RTTI(运行时类型))。因此决定了C++throw可以抛出不同类型的对象并且可以根据其类型选择异常处理程序。

    2.        异常一个重量级的特性,比一般的return要付出更多的性能代价。不要在性能敏感的地方使用异常,也不要把经常发生的情况交给异常处理程序。

     

    俞博文 2013-1-21

    展开全文
  • 结构化异常处理(SEH)在MSVC和MinGW上的使用 SEH 即 Structured Exception Handling,结构化异常处理。是 M$ 在 Windows 下实现的一套异常处理机制,用于支持软件和硬件异常处理。SEH 作为 Windows 特有的机制,同时...

    结构化异常处理(SEH)在MSVC和MinGW上的使用

    SEH 即 Structured Exception Handling,结构化异常处理。是 M$ 在 Windows 下实现的一套异常处理机制,用于支持软件和硬件异常处理。SEH 作为 Windows 特有的机制,同时也是 Windows 溢出攻击中常见的利用的途径之一。

    关于SEH的详细分析,请看Matt Pietrek的文章(原文是发布在MSDN上的,但似乎已经被删除了,这是别处转载的链接):

    英语原文:A Crash Course on the Depths of Win32 Structured Exception Handling
    英语转载:A Crash Course on the Depths of Win32 Structured Exception Handling
    译文:深入解析结构化异常处理(SEH)

    在MSVC上使用

    #include <windows.h>
    #include <Dbghelp.h>
    
    //崩溃函数
    int crashFunc()
    {
        printf("crashFunc\n");
        int *p = NULL;
        *p = 1;
        return *p;
    }
    
    LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
    {
        printf("UnhandledExceptionFilterEx call\n");
    
        return EXCEPTION_CONTINUE_SEARCH;
        //return EXCEPTION_EXECUTE_HANDLER;
    }
    
    int main(int argc, char** argv)
    {
    
        //方式1 调用winapi,把崩溃处理函数挂载在顶层异常处理中
        SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
        crashFunc();
    
    
        //方式2 使用__try/__except拦截异常
        __try
        {
            crashFunc();
        }
        __except(UnhandledExceptionFilterEx(GetExceptionInformation()))
        {
            printf("crash __except\n");
        }
    }

    在mingw上使用

    #include <windows.h>
    #include <Dbghelp.h>
    
    //崩溃函数
    int crashFunc()
    {
        printf("crashFunc\n");
        int *p = NULL;
        *p = 1;
        return *p;
    }
    
    LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
    {
        printf("UnhandledExceptionFilterEx call\n");
    
        return EXCEPTION_CONTINUE_SEARCH;
        //return EXCEPTION_EXECUTE_HANDLER;
    }
    
    int exceptEx(_In_ EXCEPTION_POINTERS *lpEP)
    {
        return UnhandledExceptionFilterEx(lpEP);
    }
    
    
    int main(int argc, char** argv)
    {
    
        //方式1 和msvc一样,都是调用winapi
        SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
        crashFunc();
    
    
        //方式2 __try1/__except1拦截异常
        __try1(exceptEx)
        {
            crashFunc();
        }
        __except1
        {
            printf("crash __except1\n");
        }
    }
    展开全文
  • <p>I need to install MinGW compiler as per the instructions given <a href="https://github.com/hybridgroup/gocv#windows" rel="nofollow noreferrer">here</a>. <h2>according to it <p>Choose the ...
  • MINGW

    2020-05-24 15:41:40
    MINGW 各种包的作用 ps:各个Package的作用: MinGW ---- MinGW Base System -------- MinGW Compiler Suit ------------ mingw32-binutils 必选,用于编译生成的 .o 文件的链接、汇编、生成静态库等。 ------------ ...

    MINGW 各种包的作用

    ps:各个Package的作用:

    MinGW
    ---- MinGW Base System
    -------- MinGW Compiler Suit
    ------------ mingw32-binutils 必选,用于编译生成的 .o 文件的链接、汇编、生成静态库等。
    ------------ mingw32-gcc 必选,核心的 C 编译器。
    ------------ mingw32-gcc-ada 可选,Ada 编译器。
    ------------ mingw32-gcc-fortran 可选,Fortran 编译器。
    ------------ mingw32-gcc-g++ 建议,C++ 编译器。
    ------------ mingw32-gcc-objc 可选,Objective-C 编译器。
    ------------ mingw32-gcc-v3-* 不建议,第三版 GCC 编译器。
    ------------ mingw32-libgcc 必需,C 编译器编译出来的程序的运行库。
    ------------ mingw32-libgfortran 可选,如选择了 Fortran 编译器,则必选,Fortran 运行库。
    ------------ mingw32-libgnat 可选,如选择了 Ada 编译器,则必选,Ada 运行库。
    ------------ mingw32-libobjc 可选,如选择了 Objective-C 编译器,则必选,Objective-C 运行库。
    ------------ mingw32-libstdc++ 可选,如选择了 C++ 编译器,则必选,C++ 运行库。
    ------------ mingw32-libgomp 可选,GNU OpenMP 库,高精度运算。
    ------------ mingw32-libquadmath 可选,QuadMath 库,数学运行。
    ------------ mingw32-libssp 可选,StackProtect 库,栈保护。
    ------------ mingw32-mingwrt 必选,MinGW 工具的运行库。
    ------------ mingw32-w32api 必选,运行 Windows 程序所必需的 DLL 文件。
    -------- MinGW Source-Level Debugger
    ------------ mingw32-gdb 可选,GNU Debugger,命令窗口的调试器。
    -------- MinGW Standard Libraries
    ------------ mingw32-gmp 可选,GNU 多精度运算库。
    ------------ mingw32-libgmp 可选,GMP 库的 DLL 文件。
    ------------ mingw32-libgmpxx 可选,GMP 库用于 C++ 的 DLL 文件。
    ------------ mingw32-mpfr 可选,MPFR 多精度运算库。
    ------------ mingw32-libmpfr 可选,MPFR 多精度浮点运算库的 DLL 文件。
    ------------ mingw32-mpc 可选,MPC 多精度运算库。
    ------------ mingw32-libmpc 可选,MPC 多精度浮点运算库的 DLL 文件。
    ------------ mingw32-libpthread-old 可选,旧版本的 POSIX 线程库的 DLL 文件。
    ------------ mingw32-libpthreadgc 可选,标准的 POSIX 线程库的 DLL 文件。
    ------------ mingw32-libpthreadgce 可选,使用 C++ 异常处理的 POSIX 线程库的 DLL 文件。
    ------------ mingw32-libquserex 可选,用于内核态的 POSIX 线程库的 DLL 文件。
    ------------ mingw32-libz 可选,zlib 库,用于 Zip 压缩及解压。
    ------------ mingw32-mingwrt 必选,MinGW 的开发库。
    ------------ mingw32-pthreads-w32 可选,POSIX 线程库的开发文件。
    ------------ mingw32-w32api 必选,Win32 SDK 的开发库。
    ---- MinGW Libraries
    -------- MinGW Supplementary Libraries
    ------------ mingw32-lua 可选,Lua 语言的编译器、运行库等。
    -------- MinGW Contributed Libraries
    ------------ mingw32-libunistring 可选,Unicode 字符串处理库。
    ---- MinGW Contributed
    -------- MinGW Contributed Applications
    ------------ mingw32-tcl 可选,Tool Command Language,tcl 语言。
    ------------ mingw32-tk 可选,tcl 语言的图形用户界面。
    ------------ mingw32-xerces-c 可选,Xerces-C++ XML 解析库。
    ---- MinGW Autotools
    -------- mingw32-autoconf 可选,用于 MSYS,Autoconf 的封装脚本
    -------- mingw32-autoconf2.* 可选,最好全选,自动配置脚本生成工具。
    -------- mingw32-automake 可选,用于 MSYS,Automake 的封装脚本
    -------- mingw32-automake1.* 可选,最好全选,自动 Makefile 生成工具。
    -------- mingw32-autotools 可选,用于 MSYS,自动选择 autoconf automake 等 Package。
    -------- mingw32-gettext 建议,GNU 软件国际化(即多语言)库。
    -------- mingw32-libasprintf 建议,GNU 软件国际化库。
    -------- mingw32-libcharset 可选,字符集转换库。
    -------- mingw32-libgettextpo 建议,GNU 软件国际化(即多语言)库。
    -------- mingw32-libiconv 可选,字符集转换库。
    -------- mingw32-libintl 建议,GNU 软件国际化库的运行时 DLL 文件。
    -------- mingw32-libltdl 可选,可移植的 dlopen 替代库。
    -------- mingw32-libtool 可选,共享库生成工具。
    MSYS
    ---- MSYS Base System
    -------- msys-base 可选,自动选择 MSYS 开发环境所需的一般的 Package。
    -------- msys-bash 必选,Bash (Bourne Again SHell),脚本解释器。
    -------- msys-bzip2 建议,bzip2 工具及开发库、运行库。
    -------- msys-core 必选,MSYS 核心文件。
    -------- msys-coreutils 必选,MSYS 核心工具。
    -------- msys-diffutils 建议,文件差别比较工具。
    -------- msys-dos2unix 可选,将 DOS (即 Windows) 换行符转换为 Unix 换行符。
    -------- msys-file 可选,判断文件类型的工具。
    -------- msys-findutils 建议,查找文件的工具。
    -------- msys-gawk 建议,字符串型 (Pattern) 扫描和处理语言的解释器。
    -------- msys-grep 建议,打印匹配型 (Pattern) 的字符串的工具。
    -------- msys-gzip 建议,gzip 工具及开发库、运行库。
    -------- msys-less 建议,命令行的文本查看器。
    -------- msys-locate 可选,基于数据库的 ‘find’ 工具。
    -------- msys-m4 建议,GNU 宏处理器。
    -------- msys-make 建议,GNU Make 工具。
    -------- msys-patch 建议,文件打补丁工具。
    -------- msys-sed 建议,GNU 流编辑器。
    -------- msys-tar 建议,GNU Tar 文件打包工具。
    -------- msys-termcap 建议,终端数据库。
    -------- msys-texinfo 建议,显示帮助文件的工具。
    -------- msys-tiny 可选,自动选择 MSYS 所需的最少 Package。
    -------- msys-xz 建议,lzma 工具及开发库、运行库。
    ---- MinGW Developer Toolkit
    -------- mingw-developer-toolkit 建议,自动选择 MSYS 环境下用于 MinGW 开发所需的 Package。
    -------- msys-autogen 建议,简化程序的生成,配合 autotool 使用。
    -------- msys-bison 建议,GNU 语法分析器生成器。
    -------- msys-bsdcpio 可选,BDS 版的 cpio 工具。
    -------- msys-bsdtar 可选,BSD 版的 tar 工具。
    -------- msys-cvs 可选,CVS 版本控制工具。
    -------- msys-diffstat 可选,diff 工具生成文件的查看器。
    -------- msys-flex 建议,快速词汇分析器生成器,一般和 bison 一起使用。
    -------- msys-guile 建议,Scheme 解释器和库。
    -------- msys-help2man 可选,生成 man 页面。
    -------- msys-inetutils 可选,通用网络客户端,包括 telnet ftp 等。
    -------- msys-libopenssl 建议,OpenSSL 库。
    -------- msys-lndir 可选,Xorg 递归目录符号链接工具。
    -------- msys-mksh 可选,MirBSD Korn Shell,脚本解释器。
    -------- msys-mktemp 可选,创建临时文件或目录。
    -------- msys-openssh 建议,OpenSSH,SSH 客户端。
    -------- msys-openssl 建议,OpenSSL 工具。
    -------- msys-perl 建议,Perl 解释器。
    -------- msys-rsync 建议,文件传输程序。
    -------- msys-vim 可选,控制台下的文件编辑器。
    ---- MSYS System Builder
    -------- 这个是用于编译用于 MSYS 系统的程序的编译器,一般不需要

    展开全文
  • 一 前言:异常处理,对于做面向对象开发的开发者来说是再熟悉不过了,例如在C#中有try{...}catch( Exception e){...}finally{.....}在C++中,我们常常会使用try{}...catch(){}块来进行异常处理。说了那么多,那么...

    一 前言:

    异常处理,对于做面向对象开发的开发者来说是再熟悉不过了,例如在C#中有

    try

    {

    ...

    }

    catch( Exception e){...}

    finally{

    .....

    }

    在C++中,我们常常会使用

    try{}

    ...

    catch(){}

    块来进行异常处理。

    说了那么多,那么到底什么是异常处理呢?

    异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。

    异常处理一般有两种模型,一种是"终止模型",一种是"恢复模型"

    "终止模型":在这种模型中,将假设错误非常关键,将以致于程序无法返回到异常发生的地方继续执行.一旦异常被抛出,就表明错误已无法挽回,也不能回来继续执行.

    "恢复模型":异常处理程序的工作是修正错误,然后重新尝试调动出问题的方法,并认为的二次能成功. 对于恢复模型,通常希望异常被处理之后能继续执行程序.在这种情况下,抛出异常更像是对方法的调用--可以在Java里用这种方法进行配置,以得到类似恢复的行为.(也就是说,不是抛出异常,而是调用方法修正错误.)或者,把try块放在while循环里,这样就可以不断的进入try块,直到得到满意的结果.

    二 面向对象中的异常处理

    大致了解了什么是异常处理后,由于异常处理在面向对象语言中使用的比较普遍,我们就先以C++为例,做一个关于异常处理的简单例子:

    问题:求两个数相除的结果。

    这里,隐藏这一个错误,那就是当除数为0时,会出现,所以,我们得使用异常处理来捕捉这个异常,并抛出异常信息。

    具体看代码:

    36835701_1.gif

    1 #include 

    2 #include 

    3 using namespace std;

    4 class DivideError:public exception

    5 {

    6  public:

    7           DivideError::DivideError():exception(){}

    8          const char* what(){

    9             return "试图去除一个值为0的数字";

    10         }

    11

    12 };

    13 double quotion(int numerator,int denominator)

    14 {

    15     if(0==denominator)          //当除数为0时,抛出异常16     throw DivideError();

    17     return static_cast(numerator)/denominator;

    18 }

    19 int main()

    20 {

    21     int number1;             //第一个数字22     int number2;             //第二个数字23     double result;

    24     cout<

    25     while(cin>>number1>>number2){

    26         try{

    27             result=quotion(number1,number2);

    28             cout<

    29

    30         }     //end try31         catch(DivideError &divException){

    32             cout<

    33                 <

    34         }

    35     }

    36

    37 }

    38

    36835701_1.gif

    在这个例子中,我们使用了头文件中的exception类,并使DivideError类继承了它,同时重载了虚方法what(),以给出特定的异常信息。

    而C#中的异常处理类则封装的更有全面,里面封装了常用的异常处理信息,这里就不多说了。

    三 C语言中的异常处理

    在C语言中异常处理一般有这么几种方式:

    1.使用标准C库提供了abort()和exit()两个函数,它们可以强行终止程序的运行,其声明处于头文件中。

    2.使用assert(断言)宏调用,位于头文件中,当程序出错时,就会引发一个abort()。

    3.使用errno全局变量,由C运行时库函数提供,位于头文件中。

    4.使用goto语句,当出错时跳转。

    5.使用setjmp,longjmp进行异常处理。

    接下来,我们就依次对这几种方式来看看到底是怎么做的:

    我们仍旧以前面处理除数为0的异常为例子。

    1.使用exit()函数进行异常终止:

    36835701_1.gif

    1 #include 

    2 #include 

    3 double diva(double num1,double num2)         //两数相除函数4 {

    5     double re;

    6     re=num1/num2;

    7     return re;

    8 }

    9 int main()

    10 {

    11    double a,b,result;

    12  printf("请输入第一个数字:");

    13   scanf("%lf",&a);

    14   printf("请输入第二个数字:");

    15   scanf("%lf",&b);

    16   if(0==b)                                //如果除数为0终止程序17   exit(EXIT_FAILURE);

    18 result=diva(a,b);

    19    printf("相除的结果是: %.2lf\n",result);

    20 return 0;

    21 }

    36835701_1.gif

    其中exit的定义如下:

    _CRTIMP void __cdecl __MINGW_NOTHROW exit (int) __MINGW_ATTRIB_NORETURN;

    exit的函数原型:void exit(int)由此,我们也可以知道EXIT_FAILURE宏应该是一个整数,exit()函数的传递参数是两个宏,一个是刚才看到的EXIT_FAILURE,还有一个是EXIT_SUCCESS从字面就可以看出一个是出错后强制终止程序,而一个是程序正常结束。他们的定义是:

    #define EXIT_SUCCESS 0

    #define EXIT_FAILURE 1

    到此,当出现异常的时候,程序是终止了,但是我们并没有捕获到异常信息,要捕获异常信息,我们可以使用注册终止函数atexit(),它的原型是这样的:int atexit(atexit_t func);

    具体看如下程序:

    36835701_1.gif

    1 #include 

    2 #include 

    3 void Exception(void)                           //注册终止函数,通过挂接到此函数,捕获异常信息4 {

    5     printf("试图去除以一个为0的数字,出现异常!\n");

    6 }

    7 int main()

    8 {

    9    double a,b,result;

    10   printf("请输入第一个数字:");

    11   scanf("%lf",&a);

    12   printf("请输入第二个数字:");

    13   scanf("%lf",&b);

    14   if(0==b)                    //如果除数为0终止程序 ,并挂接到模拟异常捕获的注册函数15   {

    16

    17   atexit(Exception);

    18   exit(EXIT_FAILURE);

    19   }

    20    result=diva(a,b);

    21    printf("相除的结果是: %.2lf\n",result);

    22 return 0;

    23 }

    36835701_1.gif

    这里需要注意的是,atexit()函数总是被执行的,就算没有exit()函数,当程序结束时也会被执行。并且,可以挂接多个注册函数,按照堆栈结构进行执行。abort()函数与exit()函数类似,当出错时,能使得程序正常退出,这里就不多说了。

    2.使用assert()进行异常处理:

    assert()是一个调试程序时经常使用的宏,切记,它不是一个函数,在程序运行时它计算括号内的表达式,如果表达式为FALSE  (0),  程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

    另外需要注意的是:assert只有在Debug版本中才有效,如果编译为Release版本则被忽略。

    我们就前面的问题,使用assert断言进行异常终止操作:构造可能出现出错的断言表达式:assert(number!=0)这样,当除数为0的时候,表达式就为false,程序报告错误,并终止执行。

    代码如下:

    36835701_2.gif代码

    3.使用errno全局变量,进行异常处理:

    errno全局变量主要在调式中,当系统API函数发生异常的时候,将errno变量赋予一个整数值,根据查看这个值来推测出错的原因。

    其中的各个整数值都有一个相应的宏定义,表示不同的异常原因:

    36835701_2.gif代码

    这里我们就不以前面的除数为0的例子来进行异常处理了,因为我不知道如何定义自己特定错误的errno,如果哪位知道,希望能给出方法。我以一个网上的例子来说明它的使用方法:

    36835701_2.gif代码

    这里试图打开一个d盘的文件,如果文件不存在,这是查看errno的值,结果是2、

    当文件存在时,errno的值为初始值0。然后查看值为2的错误信息,在宏定义那边#define    ENOFILE        2    /* No such file or directory */

    便知道错误的原因了。

    4.使用goto语句进行异常处理:

    goto语句相信大家都很熟悉,是一个跳转语句,我们还是以除数为0的例子,来构造一个异常处理的例子:

    36835701_2.gif代码

    5.使用setjmp和longjmp进行异常捕获与处理:

    setjmp和longjmp是非局部跳转,类似goto跳转作用,但是goto语句具有局限性,只能在局部进行跳转,当需要跳转到非一个函数内的地方时就需要用到setjmp和longjmp。setjmp函数用于保存程序的运行时的堆栈环境,接下来的其它地方,你可以通过调用longjmp函数来恢复先前被保存的程序堆栈环境。异常处理基本方法:

    使用setjmp设置一个跳转点,然后在程序其他地方调用longjmp跳转到该点(抛出异常).

    代码如下所示:

    36835701_1.gif

    #include 

    #include 

    jmp_buf j;

    void Exception(void)

    {

    longjmp(j,1);

    }

    double diva(double num1,double num2)         //两数相除函数 {

    double re;

    re=num1/num2;

    return re;

    }

    int main()

    {

    double a,b,result;

    printf("请输入第一个数字:");

    scanf("%lf",&a);

    printf("请输入第二个数字:");

    if(setjmp(j)==0)

    {

    scanf("%lf",&b);

    if(0==b)

    Exception();

    result=diva(a,b);

    printf("相除的结果是: %.2lf\n",result);

    }

    else

    printf("试图除以一个为0的数字\n");

    return 0;

    }

    36835701_1.gif

    四 总结:

    除了以上几种方法之外,另外还有使用信号量等等方法进行异常处理。当然在实际开发中每个人都有各种调式的技巧,而且这文章并不是说明异常处理一定要这样做,这只是对一般做法的一些总结,也不要乱使用异常处理,如果弄的不好就严重影响了程序的效率和结构,就像设计模式一样,不能胡乱使用。

    展开全文
  • 当年刚开始工作的时候,第一个工作就是学习breakpad的源代码,然后了解其原理,为公司写一个ExceptionHandle的库,以处理服务器及客户端的未处理异常(unhandleexception),并打下dump,以便事后分析,当年这个功能在...
  • Git异常 异常处理

    2020-12-12 22:54:54
    异常1: pull遇到错误:error: Your local changes to the following files would be overwritten by merge 这里的异常原因是,本地有未提交的代码,但是你又要拉取git服务器的代码 一 如果需要保存本地代码: git ...
  • C语言中的异常处理

    万次阅读 2018-08-05 13:59:00
    一 前言: 异常处理,对于做面向对象开发的开发者来说是再熟悉不过了,例如在C#中有 try { ... } catch( Exception e){...} finally{ ..... }
  • (C语言的异常处理比起java的来总觉得好费劲啊~) 上网google了一下看见了一位大牛的解释,好厉害,膜拜一下 1 . 返回值方式:用函数的返回值标志函数是否执行成功。比如成功返回1,失败返回0。这种方式的好处...
  • clang mingw

    2019-03-24 21:57:54
    下载在线安装软件https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 1.Version制定版本号,从4.9.1-8.1.0,按需选择 2.Architecture跟操作系统有关,64位系统选择x86_64,32位系统选择i686; 3.Threads...
  • jni补充和异常处理

    2016-01-12 11:19:00
    前面基本总结了常见的一些情况,包括对数组,字符串,对象的处理,基本上满足了效果。 ...我用的环境是mingw,环境变了的话,就修改makefile吧 我还有没总结的部分:异常处理 异常处理其实和jav...
  • TDM/MinGW和nuwen MinGW

    千次阅读 2013-06-20 11:22:10
    2010-04-29 13:13TDM/MinGW和nuwen MinGW Distro(打包的MinGW) komisar及其环境配置最近用MinGW在Windows平台编译东西,但MinGW主站上没有打包好的二进制包可以用,而自己配置则需要下载太多包Google一下,发现有...
  • MinGw安装配置

    2021-08-01 16:29:55
    1.下载安装MinGw 下载地址 1.版本号:选最新即可 2.电脑系统架构:32位 OR 64位 ...4.异常处理模型:(seh不支持32位) 5.建立修订:(未知作用) 2.配置环境变量 安装路径一直到bin目录 3.打开cmd,输入gcc -v ...
  • MinGW安装教程

    2021-03-13 13:25:58
    文章目录1、下载MinGW2、版本介绍2.1、GCC线程模型2.2、导常处理3、配置MinGW4、检测是否配置成功 1、下载MinGW 官网下载地址:http://www.mingw-w64.org/ 点击红框中的“Downloads”超链接,进入 MinGW-w64 下载...
  • mingw qt

    千次阅读 2014-01-06 16:36:02
    原文地址:qt">mingw qt作者:孙1东不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -...
  • MinGW-w64的安装及配置教程

    万次阅读 多人点赞 2020-12-15 21:35:29
    下载MinGW-w642.安装MinGW-w643.配置MinGW-w64路径4.验证安装 MinGW 的全称是:Minimalist GNU on Windows 。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将...
  • 安装教程 | MinGW

    2020-10-01 23:39:55
    sjlj、seh、dwarf:异常处理系统 安装 在线安装程序进行安装 打开在线安装程序 安装版本选择 安装位置选择 安装包进行安装 解压之后移动到想要安装的位置即可 官网下载及安装 下载 网站:mingw ...
  • c 异常处理

    2012-01-31 10:57:00
    C语言中的异常处理 一 前言: 异常处理,对于做面向对象开发的开发者来说是再熟悉不过了,例如在C#中有 try {  ... } catch( Exception e){...} finally{ ..... } 在C++中,我们常常会使用 try{} ...
  • MinGWMinGW-W64的区别

    千次阅读 2019-11-01 15:01:34
    为什么说要有这么坑爹不兼容的,像VC++一样用一种不就好了……其实Win32 x86上最理想的应该是和VC++一样基于SEH(Windows结构化异常处理)的实现,但是Borland关于这个的专利才没过期几天……所以你懂的。...
  • 异常处理的深度分析

    2019-06-10 12:53:55
    熟悉 c++ 的朋友们应该都知道,当我们抛出一个异常后,如果这个函数没能力去处理异常就会把这个异常原封不动的丢给调用这个函数的函数。一般来说,为了防止程序崩溃,我们会将一些敏感操作包裹到 try{}catch{} 中...
  • 科普MinGW MinGW-W64

    千次阅读 2019-02-12 20:25:44
    为什么说要有这么坑爹不兼容的,像VC++一样用一种不就好了……其实Win32 x86上最理想的应该是和VC++一样基于SEH(Windows结构化异常处理)的实现,但是Borland关于这个的专利才没过期几天……所以你懂的。...
  • MinGW vs MinGW-W64及其它

    2016-11-17 11:09:00
    而我的目标机器是Win7 64bit的,所以自然就安装了个 mingw64-x-gcc. 后来发现64bit的环境根本搭建不起来,好多依赖库都不支持;于是只能重新安装32bit的环境。 这时候问题就来了,/usr/bin下面有: i586-mingw32...
  • MinGW-w64在windows下的离线安装

    万次阅读 2019-08-17 23:26:23
    MinGW-w64在windows下的离线安装 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录MinGW-w64在windows下的离线安装@[toc]1. 下载2.安装2.1 离线安装2.2 在线安装3.配置环境...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,021
精华内容 808
关键字:

mingw异常处理