【问题标题】:Why does this basic Try-Catch fail to catch [duplicate]为什么这个基本的 Try-Catch 无法捕获 [重复]
【发布时间】:2021-07-25 05:23:15
【问题描述】:

我正在学习 C++ 中的 try-catch 构造,并且我有以下示例,该示例似乎无法执行任一 catch 中的代码。在过去的几个小时里,我一直在试图找到错误/问题,但没有运气。

我想知道我的机器上的 g++ 是否存在问题——我正在使用 mingw 的 g++ 和 Windows 10。

#include <iostream>
#include <stdexcept>

int main(){

    try {
        std::cout << "Start of Try-Catch\n";
        int a = 13;
        int b = 0;
        int p = a/b;
        std::cout << "printing p: " << p << std::endl;
        p = 43;

        std::cout << "Passed the div by zero issue\n";
    } catch (std::runtime_error& e){
        std::cout << "runtime error: " << e.what() << '\n';
        return 2;
    } catch (std::exception& e){
        std::cout << "other error: " << e.what() << '\n'; 
        return 3;
    } catch (...) {
        std::cout << "final catch\n";
        return 4;
    }
    std::cout << "end of program\n";
    return 0;
}

相反,这是我编译和运行时发生的情况:

C:\Users\...\Part 1>g++ cp_bug.cpp -std=c++17

C:\Users\...\Part 1>a.exe
Start of Try-Catch

C:\Users\...\Part 1>

【问题讨论】:

  • 你什么也没扔
  • 除以零不会引发异常。它表现出未定义的行为 - 这意味着 anything is allowed to happen,包括进入或不进入 catch 块。
  • 让我直截了当——发生异常的唯一方法是使用 throw 关键字? TY
  • @Flatley c++ 不会检查每个潜在的错误并将它们作为异常抛出。正如 Igor 指出的那样,其中许多只是undefined behaviors。这背后的主要原因是错误检查会产生成本,而 C++ 的哲学之一是不产生程序员不要求的成本(同样注意,不同的平台可能会以不同的方式处理这些错误,但 C++ 需要跨平台工作)。
  • 许多编码错误会导致关于“异常”的运行时消息。但该异常不是 C++ 异常。如果您的代码没有明确地throw 异常,无论是直接还是在库函数中,都没有什么可捕获的。

标签: c++ exception try-catch null-pointer


【解决方案1】:

这样做会更合乎逻辑:

int main(){

    try {
        std::cout << "Start of Try-Catch\n";
        int a = 13;
        int b = 0;
        if(b==0)
            throw std::string("Passed the div by zero issue\n");
        int p = a/b;
        
        std::cout << "printing p: " << p << std::endl;
    } catch (std::string e) {
        std::cout << e;
        return -1;
    }
    std::cout << "end of program\n";
    return 0;
}

【讨论】:

  • 一般来说,异常应该被const引用捕获,而不是值。所以catch(const std::string&amp; e) 而不是catch(std::string e)。别担心:异常对象会一直持续到catch 子句结束。 _1.
  • 哦,虽然我在吹毛求疵,但return -1; 是不可移植的。您可以从main 返回三个值:EXIT_FAILUREEXIT_SUCCESS 和 0。return 0;EXIT_SUCCESS 一样,表示成功。
【解决方案2】:

您的问题是除以零不会引发可以处理的异常。试试following tutorial instead

这个问题也是duplicated

【讨论】:

  • 谢谢——我没有在问题中指定这一点,但我试图让其他错误触发其中一个捕获块(即为空指针赋值),所以对我来说另一个问题不是 1:1。我想我需要使用 throw 字来实际触发其中一个 catch 块。感谢您的反馈!
  • 请注意,您链接到的“教程”处理 IEEE 754 浮点除以零,而这个问题处理整数除以零。因此,该链接中的某些信息不适用于此处,例如关于“无限”的部分。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2016-06-21
  • 2021-05-13
  • 2012-05-05
  • 2023-03-13
相关资源
最近更新 更多