【问题标题】:How to handle exception in called function in c++如何在c ++中处理被调用函数中的异常
【发布时间】:2012-05-14 06:02:51
【问题描述】:

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

例如:

//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
}

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

【问题讨论】:

  • 在调用函数之前不能检查y参数吗?
  • 您的问题标题具有误导性,因为您询问的是处理异常,但您的示例不需要抛出异常。
  • 被调用函数实际上是一个业务逻辑,不允许我做任何修改。只通过调用函数我应该做一些事情。一种方法是在其他线程中调用函数并检查状态。但不知道具体的程序..

标签: c++ exception exception-handling


【解决方案1】:

有两种方法可以处理:

强制参数检查:

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

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

抛出异常:

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

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


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

【讨论】:

  • 我认为OP的示例旨在说明您无法在调用之前检查参数的情况(不知道函数的实现细节)。
  • @juanchopanza:如果不知道函数的实现细节,就不可能处理这个问题。如果是这样的话,函数写得不好,值得一个 UB 和导致崩溃。
  • 没错。但问题是,在这些情况下该怎么办?而且我认为唯一可行的选择是您的第二个建议,假设无法用表现良好的对应功能替换该功能。
  • @juanchopanza:确实,第二个选项只是当时可行的选项。对我来说,重构糟糕的代码是一个持续不断的过程,所有这些代码都应该随着时间的推移逐步淘汰。编写糟糕的代码是有理由在不知不觉中,但没有理由允许编写糟糕的代码跑,知道这是不好的。
  • 我完全同意。糟糕的是,编写糟糕的代码通常没有良好的单元测试覆盖率。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    一般来说你可以:

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

    【讨论】:

    • 对,加了注释解释,并链接到另一个深入解释的问题。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2014-09-05
      • 2011-06-05
      • 2014-12-03
      • 1970-01-01
      • 2021-06-29
      • 2014-02-28
      相关资源
      最近更新 更多