标准程序库异常处理----计算三角形面积



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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值