|
本帖最后由 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;
- }
复制代码 |
|