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!\n";
    return 0;
}

double hmean(double a, double b)
{
    if (a == -b)
    {
        std::cout << "untenable arguments to hmean()\n";
        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的值。然而,依靠程序員來執行這中間查是不安全的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM