浙江建设集团网站首页,域名可以同时做邮箱和网站么,有哪些官网做得比较好,怎么在网络上推广exceptionType是异常类型#xff0c;它指明了当前的 catch 可以处理什么类型的异常#xff1b;variable是一个变量#xff0c;用来接收异常信息。当程序抛出异常时#xff0c;会创建一份数据#xff0c;这份数据包含了错误信息#xff0c;程序员可以根据这些信息来判断到…exceptionType是异常类型它指明了当前的 catch 可以处理什么类型的异常variable是一个变量用来接收异常信息。当程序抛出异常时会创建一份数据这份数据包含了错误信息程序员可以根据这些信息来判断到底出了什么问题接下来怎么处理。
异常既然是一份数据那么就应该有数据类型。C 规定异常类型可以是 int、char、float、bool 等基本类型也可以是指针、数组、字符串、结构体、类等聚合类型。C 语言本身以及标准库中的函数抛出的异常都是 exception 类或其子类的异常。也就是说抛出异常时会创建一个 exception 类或其子类的对象。
exceptionType variable和函数的形参非常类似当异常发生后会将异常数据传递给 variable 这个变量这和函数传参的过程类似。当然只有跟 exceptionType 类型匹配的异常数据才会被传递给 variable否则 catch 不会接收这份异常数据也不会执行 catch 块中的语句。换句话说catch 不会处理当前的异常。
我们可以将 catch 看做一个没有返回值的函数当异常发生后 catch 会被调用并且会接收实参异常数据。
catch 和真正的函数调用的区别 真正的函数调用形参和实参的类型必须要匹配或者可以自动转换否则在编译阶段就报错了。而对于 catch异常是在运行阶段产生的它可以是任何类型没法提前预测所以不能在编译阶段判断类型是否正确只能等到程序运行后真的抛出异常了再将异常类型和 catch 能处理的类型进行匹配匹配成功的话就“调用”当前的 catch否则就忽略当前的 catch。总起来说catch 和真正的函数调用相比多了一个「在运行阶段将实参和形参匹配」的过程。
另外需要注意的是如果不希望 catch 处理异常数据也可以将 variable 省略掉也即写作
try{// 可能抛出异常的语句
}catch(exceptionType){// 处理异常的语句
}这样只会将异常类型和 catch 所能处理的类型进行匹配不会传递异常数据了。
多级 catch
一个 try 对应一个 catch这只是最简单的形式。其实一个 try 后面可以跟多个 catch
try{//可能抛出异常的语句
}catch (exception_type_1 e){//处理异常的语句
}catch (exception_type_2 e){//处理异常的语句
}
//其他的catch
catch (exception_type_n e){//处理异常的语句
}当异常发生时程序会按照从上到下的顺序将异常类型和 catch 所能接收的类型逐个匹配。一旦找到类型匹配的 catch 就停止检索并将异常交给当前的 catch 处理其他的 catch 不会被执行。如果最终也没有找到匹配的 catch就只能交给系统处理终止程序的运行。
多级 catch 的使用
#include iostream
#include string
using namespace std;class Base{ };
class Derived: public Base{ };int main(){try{throw Derived(); //抛出自己的异常类型实际上是创建一个Derived类型的匿名对象coutThis statement will not be executed.endl;}catch(int){coutException type: intendl;}catch(char *){coutException type: cahr *endl;}catch(Base){ //匹配成功向上转型coutException type: Baseendl;}catch(Derived){coutException type: Derivedendl;}return 0;
}运行结果
Exception type: Base 在 catch 中我们只给出了异常类型没有给出接收异常信息的变量。 本例中我们定义了一个基类 Base又从 Base 派生类出了 Derived。抛出异常时我们创建了一个 Derived 类的匿名对象也就是说异常的类型是 Derived。
我们期望的是异常被catch(Derived)捕获但是从输出结果可以看出异常提前被catch(Base)捕获了这说明 catch 在匹配异常类型时发生了向上转型Upcasting。
catch 在匹配过程中的类型转换
C/C 中存在多种多样的类型转换以普通函数非模板函数为例发生函数调用时如果实参和形参的类型不是严格匹配那么会将实参的类型进行适当的转换以适应形参的类型这些转换包括
算数转换例如 int 转换为 floatchar 转换为 intdouble 转换为 int 等。
向上转型也就是派生类向基类的转换。
const 转换也即将非 const 类型转换为 const 类型例如将 char * 转换为 const char *。
数组或函数指针转换如果函数形参不是引用类型那么数组名会转换为数组指针函数名也会转换为函数指针。
用户自定的类型转换。
catch 在匹配异常类型的过程中也会进行类型转换但是这种转换受到了更多的限制仅能进行「向上转型」、「const 转换」和「数组或函数指针转换」其他的都不能应用于 catch。
const 转换以及数组和指针的转换
#include iostream
using namespace std;int main(){int nums[] {1, 2, 3};try{throw nums;coutThis statement will not be executed.endl;}catch(const int *){coutException type: const int *endl;}return 0;
}运行结果
Exception type: const int *nums 本来的类型是int [3]但是 catch 中没有严格匹配的类型所以先转换为int *再转换为const int *。