【问题标题】:I cannot catch and handle floating point exception? [duplicate]我无法捕获和处理浮点异常? [复制]
【发布时间】:2019-06-24 04:29:58
【问题描述】:

我尝试编写一个简单的程序来练习C++的Expection,但是我无法捕获和处理浮点异常?

这是我的代码。

#include <iostream>                                              
#include <string>                                                
#include <exception>                                             

using namespace std;                                             

int main(int argc, char **argv) {                                

    int num_1[] = {0, 2, 4, 6, 8}, num_2[] = {3, 2, 1, 0, -1};   

    for(int i = 0; i < sizeof(num_1) / sizeof(num_1[0]); i++) {  
        try {                                                    
            int result = num_1[i] / num_2[i];                    
            printf("%d / %d = %d\n", num_1[i], num_2[i], result);
        } catch(exception &e) {                                  
            cout << e.what() << endl;                            
            cout << "something is wrong." << endl;               
            continue;                                            
        }                                                        
    }                                                            

    return 0;                                                    
}                                                                

这是我的结果,但不是我想要的。

0 / 3 = 0
2 / 2 = 1
4 / 1 = 4
Floating point exception (core dumped)

【问题讨论】:

标签: c++


【解决方案1】:

“浮点异常”是信号的名称 (SIGFPE)。如果您尝试将整数除以 0(或者如果您将 INT_MIN 除以 -1),则会收到此信号。换句话说,它与浮点运算或异常(在 C++ 意义上)无关,所以这个名字有点不幸。

最简单的解决方案是预先检查 0:

if (num_2[i] == 0 || (num_1[i] == INT_MIN && num_2[i] == -1)) {
    // handle error, or throw your own exception
    ...
}
int result = num_1[i] / num_2[i];

【讨论】:

  • @Graycat - 换句话说,“不。信不信由你,C++ not 允许您“捕获”带有 C++ 异常的浮点异常”。跨度>
  • 查看这个关于如何将此信号转换为 C++ 异常的答案:stackoverflow.com/a/25601100/2527795
  • @paulsm4 简短但有用。
  • @Graycat 老兄,你不必回复每条评论。这不是论坛。
【解决方案2】:

谢谢大家,在你们的帮助下我理解了我的错误。很抱歉,我无法回复每条评论。请允许我整理出有用的答案。

  • “浮点异常”是信号而不是异常的名称。
  • “整数除以零”在标准 C++ 中也不例外。

这是我的新代码。

#include <iostream>                                                                       
#include <exception>                                                                      

using namespace std;                                                                      

int main(int argc, char **argv) {                                                         

    int num_1[] = {0, 2, 4, 6, 8}, num_2[] = {3, 2, 1, 0, -1};                            

    for(int i = 0; i < sizeof(num_1) / sizeof(num_1[0]); i++) {                           
        try {                                                                             
            if(num_2[i] == 0 || (num_1[i] == INT32_MIN && num_2[i] == -1)) {              
                throw "catch my expection";                                               
            }                                                                             
            cout << num_1[i] << " / " << num_2[i] << " = " << num_1[i] / num_2[i] << endl;
        } catch(const char *e_msg) {                                                      
            cout << e_msg << endl;                                                        
            cout << "sth is error" << endl;                                               
            continue;                                                                     
        }                                                                                 
    }                                                                                     

    return 0;                                                                             
}                                                                                         

这是我想要的结果。

0 / 3 = 0
2 / 2 = 1
4 / 1 = 4
catch my expection
sth is error
8 / -1 = -8

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2010-12-11
    • 2019-09-30
    相关资源
    最近更新 更多