C++标准提供了一组标准异常类, 以基类exception开始, 派生出其他异常类
该基类提供一个成员函数what(), 用于返回错误信息, 声明如下:
virtual const char * what() const throw();
C++ 标准库定义了一组类,用于报告在标准库中的函数遇到的问题。程序员可在自己编写的程序中使用这些标准异常类。标准库异常类定义在四个头文件中:
1) exception 头文件定义了最常见的异常类,它的类名是 exception。这个类只通知异常的产生,但不会提供更多的信息。
2) stdexcept 头文件定义了几种常见的异常类,这些类型见下表:
exception | The most general kind of problem. 最常见的问题。 |
runtime_error | Problem that can be detected only at run time. 运行时错误:仅在运行时才能检测到问题 |
range_error | Run-time error: result generated outside the range of values that are meaningful. 运行时错误:生成的结果超出了有意义的值域范围 |
overflow_error | Run-time error: computation that overflowed. 运行时错误:计算上溢 |
underflow_error | Run-time error: computation that underflowed. 运行时错误:计算下溢 |
logic_error | Problem that could be detected before run time. 逻辑错误:可在运行前检测到问题 |
domain_error | Logic error: argument for which no result exists. 逻辑错误:参数的结果值不存在 |
invalid_argument | Logic error: inappropriate argument. 逻辑错误:不合适的参数 |
length_error | Logic error: attempt to create an object larger than the maximum size for that type. 逻辑错误:试图生成一个超出该类型最大长度的对象 |
out_of_range | Logic error: used a value outside the valid range. 逻辑错误:使用一个超出有效范围的值 |
3) new 头文件定义了 bad_alloc 异常类型,提供因无法分配内存而由 new 抛出的异常。
4) type_info 头文件定义了 bad_cast 异常类型。
标准库异常类
标准库异常类只提供很少的操作,包括创建、复制异常类型对象以及异常类型对象的赋值。
exception、bad_alloc 以及 bad_cast 类型只定义了默认构造函数,无法在创建这些类型的对象时为它们提供初值。
其他的异常类型则只定义了一个使用 string 初始化式的构造函数。
当需要定义这些异常类型的对象时,必须提供一个 string 参数。string 初始化式用于为所发生的错误提供更多的信息。
异常类型只定义了一个名为 what 的操作。这个函数不需要任何参数,并且返回 const char* 类型值。
它返回的指针指向一个 C 风格字符串。使用 C 风格字符串的目的是为所抛出的异常提出更详细的文字描述。
what 函数所返回的指针指向 C 风格字符数组的内容,这个数组的内容依赖于异常对象的类型。
对于接受 string 初始化式的异常类型,what 函数将返回该 string 作为 C 风格字符数组。
对于其他异常类型,返回的值则根据编译器的变化而不同。
#include "stdafx.h"
#include <iostream>
#include <stdexcept>
using namespace std;
给出三角形三边长,计算三角面积
double area(double a, double b, double c) throw(invalid_argument) {
if(a<=0 || b<=0 || c<=0) //判断三角形边长是否为正
//logic_error 和runtime_error 两类及其派生类, 都有一个接收const string & 型参数的构造函数
//构造异常对象时需要将具体的错误信息传递给构造函数
throw invalid_argument("the side length should be positive");
if(a+b<=c || a+c<=b || b+c<=a) //判断三边长是否满足三角不等式
throw invalid_argument("the side length should fit the triangle inequation");
double s=(a+b+c)/2; //由Heron 公式计算三角形面积
return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main() {
double a, b, c;
cout<<"Please input the side lengths of a triangle: ";
cin>>a>>b>>c;
try {
double s=area(a, b, c);
cout<<"Area: "<<s<<endl;
}
catch(exception &e) {
cout<<"Error: "<<e.what()<<endl; //调用该对象的what函数,得到构造是的错误信息
}
system("pause");
return 0;
}