如何在c ++中处理被调用函数中的异常

时间:2012-05-14 06:02:52

标签: c++ exception exception-handling

如果我必须调用一个特定的函数,其中正在发生偏差。我们无法修改被调用函数中的任何内容。唯一可以防止的方法是在调用函数时做一些修改。怎么做?

代表:

//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 个答案:

答案 0 :(得分:3)

有两种方法可以解决这个问题:

执行参数检查:

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

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

OR

抛出异常:

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

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


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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

一般来说,你可以:

  1. 在调用函数之前检查参数以确保它们有效。该函数应包括一些指定有效输入范围的文档。
  2. 抓住异常。 (这是not applicable in this case,但一般来说这是一个选项。)

答案 3 :(得分:0)

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

if(i == 0)
  cout<<" info::i is equal to zero";
else
  func(5,i);