标签:类型转换 code 内存 模块 思想 转换 数组 导致 间接
异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。
C++异常处理进制由三个模块组成:try、throw、catch
try---catch基本语法:
try { 可能抛出异常的语句;(检查) } catch(类型名[形参名])//捕获特定类型的异常 { //处理1; } catch(类型名[形参名])//捕获特定类型的异常 { //处理2; } catch(…)//捕获所有类型的异常 { }
示例:
void f1(int i) { if (i<0) throw 1; } void f2() { f1(-45); } void f3() { f2(); } void f4() { f3(); } int main() { try{ f4(); } catch (int i) { cout <<"error code:"<< i <<"\n"<< endl; } system("pause"); return 0; }
try块里面抛出哪种异常,则catch里面捕获哪种类型的异常,一般情况下,类型必须完全匹配,但以下三种情况可以进行类型转换:
(1)运行从非const对象到const对象转换,即throw一个非const对象,catch一个const对象
(2)运行从派生类类型到基类型的转换
(3)将数组转换为数组类型的指针,函数转换为指向函数类型的指针
void fun(int i)
{
if (i < 0)
throw - 1;
}
void fun2()
{
try
{
fun(-23);
}
catch (int i)
{
switch (i)
{
case -1;
throw "数据越界";//重新抛出
}
}
}
int main()
{
try
{
fun2(-34);
}
catch (const char *s)
{
cout << "error code:" << s<<"\n" << endl;
}
system("pause");
return 0;
}
(1)函数声明之后,列出函数可能抛出的异常类型,并保证该函数不会抛出其他类型的异常
a. void fun() throw(toobig,toosmall,divzero); // 函数抛出指定异常
b. void f(); // 这意味函数会抛出任何一种异常
c. void f() throw(); // 这意味函数不会抛出异常
(2) 保证不在构造函数中抛出异常,因为构造函数的作用是构造对象并初始化,一旦抛出异常,有可能导致对象不完整或没有完全初始化
(3)保证不在析构函数中抛出异常,因为析构函数的作用是完成资源的清理,一旦抛出异常,有可能导致内存泄露等等
标签:类型转换 code 内存 模块 思想 转换 数组 导致 间接
原文地址:https://www.cnblogs.com/xiaobingqianrui/p/8855836.html