firemail
标题:
异常处理
[打印本页]
作者:
Qter
时间:
2020-1-1 14:58
标题:
异常处理
本帖最后由 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;
}
复制代码
欢迎光临 firemail (http://firemail.wang:8088/)
Powered by Discuz! X3