0

如果我必须调用一个发生除零的特定函数。我们不能修改被调用函数中的任何内容。防止的唯一方法是在调用函数中进行一些修改。怎么做?

例如:

//calling function

int func(5,1);

//called function

int func(int x,int y)
{
  y--;
 return(x/y); // here divide by zero will occur, but we cannot do any thing in 
              // called function
}

如何保持我们的应用程序运行而不是这个异常?

4

4 回答 4

3

有两种方法可以处理这个问题:

强制参数检查:

在调用代码中,您应该检查除数。

if(y != 0)
    func(x,y);
else
  //Some log or error handling

或者

抛出异常:

整数除以零不是标准 C++ 异常。所以你不能依赖隐式抛出的异常。特定的编译器可能会将除以零映射到某种异常(您需要为此检查编译器文档),如果是这样,您可以捕获该特定异常。但是,请注意,这不是可移植行为,并且不适用于所有编译器。

因此,鉴于上述情况,您可以做的最好的事情是自己检查错误条件(除数等于零)并明确抛出 type 的异常std::runtime_error


无论哪种情况,您的代码都应该适当地记录行为,在第一种情况下,您的代码应该记录有效的支持值,而在第二种情况下,它应该指定可以引发哪些异常。

于 2012-05-14T06:05:45.353 回答
1

在 Linux 下,您可以为 SIGFPE 安装信号处理函数(使用 signal(2))并在其中抛出异常,然后使用 -fnon-call-exceptions 编译代码。

一旦完成,除以零将导致抛出异常。

对于 Windows,这里提到了一些东西:Dealing with Floating Point exceptions

于 2012-05-14T06:19:41.373 回答
0

您可以在调用函数中执行此操作:-

if(i == 0)
  cout<<" info::i is equal to zero";
else
  func(5,i);
于 2012-05-14T06:12:20.187 回答
0

一般来说,您可以:

  1. 在调用函数之前检查参数以确保它们是有效的。该函数应包括一些指定有效输入范围的文档。
  2. 捕捉异常。(这在这种情况下不适用,但通常是一种选择)。
于 2012-05-14T06:05:29.487 回答