【发布时间】: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