zoukankan      html  css  js  c++  java
  • C++异常 调用abort()

    以一个计算两个数的调和平均数的函数为例。两个数的调和平均数的定义是:这两个数倒数的平均值的倒数,因此表达式为:
    1.0 * x * y / (x + y)
    如果y是x的负值,则上述公式将导致被零除——一种不允许的运算。对于被零除的情况,很多新式编译器通过生成一个表示无穷大的特殊浮点值来处理,cout将这种值显示为Inf、inf、INF或类似的东西;而其他的编译器肯呢哥生成在发生被零除时崩溃的程序。最好编写在所有系统上都以相同的受控方式运行的代码。
    对于这种问题,处理方式之一是,如果其中一个参数是另一个参数的负值,则调用abort()函数。Abort函数的原型位于头文件cstdlib(或stdlib.h)中,其典型实现是向标准错误流(即cerr使用的错误流)发送消息abnormal program termination(程序异常终止),然后终止程序。它还返回一个随实现而异的值,告诉操作系统(如果程序是由另一个程序调用的,则告诉父进程),处理失败。abort()是否刷新文件缓冲区(用于存储读写到文件中的数据内存区域)取决于实现。如果愿意,也可以使用exit(),该函数刷新文件缓冲区,但不显示消息。
    下面是一个使用abort()的小程序。
    error1.cpp

    // error1.cpp -- using the abort() function
    #include <iostream>
    #include <cstdlib>
    double hmean(double a, double b);
    
    int main()
    {
        double x, y, z;
    
        std::cout << "Enter two numbers: ";
        while (std::cin >> x >> y)
        {
            z = hmean(x, y);
            std::cout << "Harmonic mean of " << x << " and " << y
                      << " is " << z << std::endl;
            std::cout << "Enter next set of numbers <q to quit>: ";
        }
        std::cout << "Bye!
    ";
        return 0;
    }
    
    double hmean(double a, double b)
    {
        if (a == -b)
        {
            std::cout << "untenable arguments to hmean()
    ";
            std::abort();
        }
        return 2.0 * a * b / (a + b);
    }

    效果:

    Enter two numbers: 3 6
    Harmonic mean of 3 and 6 is 4
    Enter next set of numbers <q to quit>: 10 -10
    untenable arguments to hmean()
    Aborted (core dumped)

    在hmean()中调用abort()函数将直接终止程序。(所以看不到"Bye!")
    为了避免异常终止,程序员在调用hmean()函数之前应检查x和y的值。然而,依靠程序员来执行这中间查是不安全的。

  • 相关阅读:
    每日一练leetcode
    每日一练leetcode
    每日一练 leetcode
    每日一练leetcode
    每日一练leetcode
    leetcode每日一练
    BigDecimal类 定义及用法
    每日一练leetcode
    每日一练leetcode
    字符串表达式校验&求值(C#实现) 附代码
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5670278.html
Copyright © 2011-2022 走看看