• Index

标准异常类

Reads: 1

基础示例

#include <iostream> // std::cout std::endl
#include <stdexcept> // std::domain_error
#include <cmath> // std::sqrt

double mysqrt(double value);

int main(void)
try
{
    std::cout << mysqrt(100) << std::endl;
    std::cout << mysqrt(-100) << std::endl;
    return 0;
}
catch (const std::exception &e)
{
    std::cout << e.what() << std::endl;
}

double mysqrt(double value)
{
    if (value < 0)
    {
        throw std::domain_error("需要开平方的参数不能是负数");
    }
    return sqrt(value);
}

输出结果:

10
需要开平方的参数不能是负数

基础讲解

上面代码是如何使用标准异常类库里面的异常类,下面详细讲解标准异常类库。

出现错误的情况下一般都都会选择抛出std::exception的派生类对象,而不是随便抛出一个变量或者值。这时候我们可以选择标准库里面已经设计好的异常类型,这些类型都在标准库stdexcept中。

标准异常类库stdexcept里面的异常类分为两大类:逻辑错误运行时错误

逻辑错误的异常类型是std::logic_error,它继承自std::exceptionstd::logic_error异常是用来报告程序内部的逻辑错误,不过一般用来作为基类供更加具体的逻辑错误继承。而所有的逻辑错误一般都可以在程序运行之前被发现。它的用法是:throw std::logic_error("逻辑错误信息");

运行时错误的异常类型是std::runtime_error,它继承自std::exceptionstd::runtime_error异常是用来报告程序运行的时候出现的错误,不过一般用来作为基类供更加具体的运行时错误继承。它的用法是:throw std::runtime_error("运行时错误信息");

逻辑错误在标准库中又可以细分成以下几种,它们都继承自std::logic_error

  • std::domain_error:用在不符合数学定义的错误上。如:求开平方的函数只接收非负数,而调用的时候提供了负数。然而在标准库中所有的函数都不会抛出这个异常,设计这个异常只是为了可以在自己写的代码中使用。用法:throw std::domain_error("错误信息");
  • std::invalid_argument:用在无效的函数参数上。用法:throw std::invalid_argument("错误信息");
  • std::length_error:用在错误的长度上。如std::vectorstd::string的成员函数resize,当分配过大的数量时会抛出这个异常。用法:throw std::length_error("错误信息");
  • std::out_of_range:用在越界错误上。如std::vector的成员函数at,当容器只有3个元素,你操作第4个元素的时候,会抛出这个异常。用法:throw std::out_of_range("错误信息");

运行时错误在标准库中又可以细分成以下几种,它们都继承自std::runtime_error

  • std::range_error:用在值域错误上(即计算结果不能以目标类型表示的情形)。如:含中文的UTF-8编码字符串转换成ISO-8859-1编码(该字符集不能表示中文)字符串。用法:throw std::range_error("错误信息");
  • std::overflow_error:用在算术上溢错误。用法:throw std::overflow_error("错误信息");
  • std::underflow_error:用在算术下溢错误。然而在标准库中所有的函数都不会抛出这个异常,设计这个异常只是为了可以在自己写的代码中使用。用法:throw std::underflow_error("错误信息");

Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.