|  | 
 
| 本帖最后由 Qter 于 2020-1-28 21:06 编辑 
 http://www.firemail.wang:8088/forum.php?mod=viewthread&tid=3969
 atexit
 复制代码/*
* Copyright (c) 2009,CVICSE
* All rights reserved.
*
* 文件名称:atexit.cpp
* 文件标识:atexit exit
* 摘 要:atexit的参数类型为void (__cdecl *)(void)
*
* 当前版本:1.0
* 作 者:draeag
* 完成日期:2009年6月22日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include <stdio.h>
#include <stdlib.h>
static void atexit_handler_1(void)
{
        printf("within 'atexit_handler_1'\n");
}
static void atexit_handler_2(void)
{
        printf("within 'atexit_handler_2'\n");
}
int main(void)
{
        atexit(atexit_handler_1);
        atexit(atexit_handler_2);
        exit(EXIT_SUCCESS);
        printf("this line should never appear\n");
        return 0;
}
复制代码/*
* Copyright (c) 2009,CVICSE
* All rights reserved.
*
* 文件名称:except1.cpp
* 文件标识:try catch
* 摘 要:数组越界异常处理
*
* 当前版本:1.0
* 作 者:draeag
* 完成日期:2009年6月22日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include <iostream>
using namespace std;
template<class T>
class Array
{
        int i;
        T *ar;
public:
        Array(int c) : i( c )
        {
                ar = new T[c];
        }
        void init(int n, T x)
        {
                ar[n] = x;
        }
        T& operator[] (int n)
        {
                if( n >= i )
                        throw n;
                return ar[n];
        }
};
void main()
{
        Array<int> array(5);
        cout<<"Please input every element's value:"<<endl;
        try
        {
                for( int i = 0; i < 5; i++ )
                {
                        cout<<"No." << i + 1 <<": ";
                        cin>>array[i];
                }
                cout << array[5]; //测试数组越界从而导致异常处理的产生
        }
        catch(int x)
        {
                cout << "A error array ID number has benn found. This value is "<< x <<endl;
        }
}
复制代码/*
* Copyright (c) 2009,CVICSE
* All rights reserved.
*
* 文件名称:except2.cpp
* 文件标识:异常处理类 服务对象类
* 摘 要:被异常处理扔出的参数也可以为类对象,这种类专门用于处理系统错误的,
*                故称为异常处理类,与之相关联的产生异常的类便被称为服务对象类.两者即可以是同级并行的,
*                也可以作为服务对象类的包容类而存在。前者多用于处理整个系统的各种异常处理;
*                而后者则是专用于为一个系统的异常处理而设置的。
*
* 当前版本:1.0
* 作 者:draeag
* 完成日期:2009年6月22日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include <iostream>
using namespace std;
class Err
{
        int err_number;
public:
        Err(int x) : err_number(x)
        {
                cout << "A error array ID number has been found." <<endl;
        }
        int get_err_number()
        {
                return err_number;
        }
};
template<class T>
class Array
{
        int i;
        T *ar;
public:
        Array(int c) : i( c )
        {
                ar = new T[c];
        }
        void init(int n, T x)
        {
                ar[n] = x;
        }
        T& operator[] (int n)
        {
                if( n >= i )
                        throw Err(n);
                return ar[n];
        }
};
void main()
{
        Array<int> array(5);
        cout<<"Please input every element's value:"<<endl;
        try
        {
                for( int i = 0; i < 5; i++ )
                {
                        cout<<"No." << i + 1 <<": ";
                        cin>>array[i];
                }
                cout << array[5]; //测试数组越界从而导致异常处理的产生
        }
        catch(Err& ex)
        {
                cout << "This value is "<< ex.get_err_number() <<endl;
        }
}
复制代码/*
* Copyright (c) 2009,CVICSE
* All rights reserved.
*
* 文件名称:setjmp.cpp
* 文件标识:非局部goto机制
* 摘 要:setjmp(j)设置goto指针,jmp_buf用当前程序上下文信息来初始对象j.
*                这种上下文信息典型包括位置指针、堆栈与框架指针,还有其寄存器与内存值。
*                当初始化上下文件信息后,setjmp返回0。稍后调用longjmp(j, r)的结果,
*                goto到对象j指定的地方(之前调用setjmp进行初始化j的地方),
*                当调用的目标非局部goto时,setjmp返回r,如果r是0返回1.
*
* 当前版本:1.0
* 作 者:draeag
* 完成日期:2009年6月22日
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{
        printf("exception raised\n");;
        longjmp(j, 8);//jump to exceptino handler  稍后调用longjmp(j, r)的结果,goto到对象j指定(之前调用setjmp进行初始化j)的地方(goto指针)
        printf("this line should never appear\n");
}
int main(void)
{
        if(  setjmp(j) == 0 )   //设置goto指针  jmp_buf用当前程序上下文信息来初始对象j,当初始化上下文件信息后,setjmp返回0
        {
                printf("'setjmp' is initializing 'j'\n");
                raise_exception(); //Restore context
                printf("this line should never appear\n");
        }
        else
        {
                printf("'setjmp' was just jumped into\n");;//this coide is the exception handler
        }
        return 0;
}
 | 
 |