【try……catch】C++ try…… catch 笔记
-
catch(CException *e) 打印异常信息
在进行各种各样的操作的时候,有时会出现未知的错误,又不知道什么类型的,一时摸不着头脑了,以前写过捕获的代码,但是用到的时候忘记了,现在记下来:
try
{
MoveFile("D:\\fd.txt", "C:\\dbdw\\b.txt"); //将D:\fd.txt移动到C:\dbdw并改名为b.txt(原来目录下文件不存在)
}
catch(CException *e)//&e
{
TCHAR szError[1024];
e->GetErrorMessage(szError,1024); // e.GetErrorMessage(szError,1024);
::AfxMessageBox(szError);
}
那么这样就可以知道什么错误了!
-
不经意间的内存泄露:try-catch(CException *e) [异常对象需要手动释放]
原本以为异常对象是不用手动释放的(即不用delete)
但今天发现跑了N天的服务器程序内存使用增大
在调试的时候也发现VS给出内存泄露的提示
才知道CException自带Delete方法且需要手动调用
像这样才对
try
{
}
catch (CException *e)
{
e->Delete();
}
在尽量保证代码健壮性的前提下
再包上一层try-catch确实能够应对一些意外情况
但所有基于CException的异常不能直接delete
像下面的写法是错误的
try
{
}
catch (CException *e)
{
delete e;
}
原文:https://blog.****.net/sidyhe/article/details/47400787
-
C++ try catch 捕获空指针异常,数组越界异常
void TestEmptyPointType()
{
try
{
int* p = NULL;
*p = 3;
}
catch(...)
{
cout<< "非法地址操作异常" << endl;
}
}
void TestDivZeroType()
{
try
{
int b = 0;
int a = 3/b;
}
catch(...)
{
cout<< "0除异常" << endl;
}
}
void TestMemoryOutType()
{
int * a = new int[4];
try
{
for (int i = 0; i<245; i++)
{
a++;
}
*a = 3;
}
catch(...)
{
cout<< "内存越界异常" << endl;
}
}
-
C++ try catch 异常类
catch (CException *e) 的CException 就是一个类
主要
有
包括int、double(分别的)、exception(所有的)n等等类型。下面来超一段图表
异常类继承层级结构图如下:
每个类所在的头文件在图下方标识出来.
标准异常类的成员:
① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。
② logic_error类及其子类、runtime_error类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述;
③ 所有的异常类都有一个what()方法,返回const char* 类型(C风格字符串)的值,描述异常信息。
标准异常类的具体描述:
原文:https://blog.****.net/songzi1111/article/details/9299587
-
异常类大全
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <fstream>
#include <memory>
#include <cstdlib>
int main(int argc, char *argv[])
{
try
{
throw std::range_error("Hello Wolrd");
} catch (std::range_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::underflow_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::overflow_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::length_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::out_of_range e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::invalid_argument e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::domain_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::runtime_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::logic_error e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::bad_cast e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::bad_alloc e)
{
std::cout << e.what() << std::endl;
abort();
} catch (std::exception e)
{
std::cout << e.what() << std::endl;
abort();
}catch(...)
{
std::cout<<"This fuck"<<std::endl;
}
return 0;
}