以一個計算兩個數的調和平均數的函數為例。兩個數的調和平均數的定義是:這兩個數倒數的平均值的倒數,因此表達式為:
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的值。然而,依靠程序員來執行這中間查是不安全的。