我开始学习C ++编程,并对错误处理有疑问。
我已经制作了一个代码来计算函数ax+b=0
中的x(所以我必须将-b
除以a
)。用户通过cin >>
如果我除以0,我得到-int
作为输出。是否可以捕获错误(例如使用if
语句)?
我知道除以零是不可能的,而且我也知道如果不检查用户的输入(例如if ((a != 0)){calculate}
),它就不是一个好的行为。问题是我想知道如何/如何捕获此错误;-)它是否依赖于硬件,操作系统或编译器?
我的老师无法帮助我;)
顺便说一下。我在Mac OS X 10.8.2上使用Eclipse Juno IDE for C / C ++
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a, b, x; //float da Kommazahlen erwartet werden
cout << "ax + b = 0" << '\n'<< endl;
cout << "Bitte geben Sie einen Wert für a ein:" << endl;
cin >> a;
cout << "Bitte geben Sie einen Wert für b ein:" << endl;
cin >> b;
x = -b/a;
cout << "Ergebnis:" << x << endl;
if (x == #INF )
{
cout << "Du bist a Volldepp - durch Null kann man nicht teilen!" << endl;
}
return 0;
}
答案 0 :(得分:7)
是:
在C ++ 03中
if ((x == +std::numeric_limits<float>::infinity()) ||
(x == -std::numeric_limits<float>::infinity())
)
在C ++ 11中
if (std::isinf(x))
答案 1 :(得分:4)
在尝试除法之前,只需检查a == 0
:
if (a == 0) {
std::cerr << "I'm not even going to try\n";
return 1;
} else {
std::cout << "-b/a = " << (-b/a) << std::endl;
}
但是,对于一些非常小的数字,这仍然会产生inf
。
(请注意,一般情况下,检查float
是否等于某个值是not reliable because of round-off errors,但是对于零则没问题。)
答案 2 :(得分:1)
您应该在计算之前检查输入的正确性,而不是之后:
if ( a == 0 ) {
if ( b == 0 )
cout << "equation valid for all x" << endl;
else
cout << "no x satisfies this equation" << endl;
}
答案 3 :(得分:1)
是的,处理这种情况的最佳方法是== 0条件。除以零也不例外,它在硬件级别处理。硬件向操作系统和操作系统发送中断,从而导致应用程序崩溃。 它可以通过信号捕获:
#include <csignal>
#include <iostream>
using namespace std;
void handler(int nVal)
{
cout << "Divid By Zero Error" << endl;
}
int main()
{
signal(SIGFPE, handler);
int nVal = 1/0;
}
答案 4 :(得分:1)
我回应其他海报说你应该检查你的论点,但还有另一种选择:http://en.cppreference.com/w/cpp/numeric/math/math_errhandling
根据该链接,在C ++ 11中,您可以设置#define
以使其在除以零时抛出FE_DIVBYZERO
类型的异常。但该页面上的文档并不清楚,因此请调查一下您自己的编译器是否支持此功能。
答案 5 :(得分:0)
您无法在C
中捕获异常,但可以通过检查值来避免异常。
尝试这样,它会帮助你
if (a == 0) {
x = 0;
} else {
x = b/a;
}