异常发生第一现场,抛出异常
void function( ){
//… …
throw 表达式;
//… …
}
在需要关注异常的地方,捕捉异常
try{
//程序
function();
//程序
}catch(异常类型声明){
//… 异常处理代码 …
}catch(异常类型 形参){
//… 异常处理代码 …
}catch(…){ //其它异常类型
//
}
注意事项:
通过throw操作创建一个异常对象并抛掷
在需要捕捉异常的地方,将可能抛出异常的程序段嵌在try块之中
按正常的程序顺序执行到达try语句,然后执行try块{}内的保护段
如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从try块后跟随的最后一个catch子句后面的语句继续执行下去
catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕获并按catch子句中的代码处理异常(或继续抛掷异常)
如果没有找到匹配,则缺省功能是调用abort终止程序。
提示:处理不了的异常,我们可以在catch的最后一个分支,使用throw语法,继续向调用者throw。
main
// p15-3.2 异常处理基本语法.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//
#include
#include<stdio.h>
#include<stdlib.h>
#include
using namespace std;
#define BUFSIZE 1024
int copyfile2(const char* dest,const char* src)
{
FILE* fp1 = NULL, * fp2 = NULL;
throw 0.01f;
fopen_s(&fp1, src, "rb");
if (fp1 == NULL)
{
throw new string("文件不存在");
}
fopen_s(&fp2, dest, "wb");
if (fp2 == NULL)
{
throw - 2;
}
char buffer[BUFSIZ];
int readlen, writelen;
while ((readlen=fread(buffer,1,BUFSIZ,fp1))>0)
{
writelen = fwrite(buffer, 1, readlen, fp2);
if (readlen != writelen)
{
throw - 3;
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
int copyfile1(const char* dest, const char* src)
{
try {
copyfile2(dest, src);
}
catch (float e)
{
printf(“copyfile1-catch…\n”);
throw e;
}
return 0;
}
int main()
{
int ret = 0;
try
{
printf("开始执行copyfile...\n");
ret = copyfile1("a.txt", "b.txt");
printf("执行copyfile1完毕\n");
}
catch (int error) {
printf("出现异常啦!%d\n", error);
}
catch (string* error) {
printf("捕捉到字符串异常:%s\n", error->c_str());
delete error;
}
catch (float error) {
printf("出现异常啦!%f\n", error);
}
catch (...) {
printf("catch ...\n");
}
}