尝试将异常处理添加到我的C ++程序中,但我觉得它很混乱。程序将值i和j设置为它们的最高可能值并递增它们。我想我希望异常处理在发生时检测整数溢出/环绕(?)
到目前为止,这就是我所拥有的:
#include <iostream>
#include <limits.h>
#include <exception>
#include <stdexcept>
using namespace std;
int main() {
int i;
unsigned int j;
try{
i = INT_MAX;
i++;
cout<<i;
}
catch( const std::exception& e){
cout<<"Exception Error!";
}
try{
j = UINT_MAX;
j++;
cout<<j;
}
catch(const std::exception& e){
cout<<"Exception Error!";
}
}
程序运行,但异常处理部分不起作用。
可能是什么问题?
答案 0 :(得分:6)
将i
递增到INT_MAX
之外的行为是 undefined 。那是因为它是一个有符号整数类型。在这种情况下,我从未遇到过抛出异常的实现。 (典型的行为是环绕到INT_MIN
,但不依赖于此。)
将j
增加到超出UINT_MAX
必须环绕为0.这是因为它是unsigned
类型。也就是说,必须从不抛出异常。
答案 1 :(得分:3)
C ++没有定义在整数溢出的情况下抛出的任何异常。如果您想要实现此类行为,则需要一些具有相应功能的整数类包装器,例如Safe Int library。例如:
#include <safeint.h>
#include <iostream>
int main()
{
try
{
::msl::utilities::SafeInt<int> j;
for(;;)
{
++j;
}
}
catch(::msl::utilities::SafeIntException const & exception)
{
switch(exception.m_code)
{
case ::msl::utilities::SafeIntArithmeticOverflow:
{
::std::cout << "overflow detected" << ::std::endl;
break;
}
default:
{
break;
}
}
}
return(0);
}
答案 2 :(得分:0)
在C ++中,异常不会发生。 throw
关键字会引发异常;如果您的代码(或您链接到的代码)没有throw something()
,则不会抛出异常。