C++异常处理

use*_*793 5 c++ error-handling exception-handling runtime-error exception

所以我正在编写一些代码,我注意到除了语法,类型和其他编译时错误之外,C++不会抛出任何其他异常.所以我决定用一个非常简单的程序来测试它:

#include<iostream>

int main() {
    std::count<<5/0<<std::endl;
return 1
}
Run Code Online (Sandbox Code Playgroud)

当我用g ++编译它时,g ++给了我一个警告,说我除了0但是它仍然编译了代码.然后,当我运行它时,它打印了一些非常大的任意数字.当我想知道的是,C++如何处理异常?整数除以0应该是一个非常简单的例子,它应该抛出异常并且程序应该终止.

我是否必须将我的整个程序封装在一个巨大的try块中然后捕获某些异常?我在Python中知道抛出异常时,程序将立即终止并打印出错误.C++做什么?是否有运行时异常停止执行并终止程序?

HC4*_*ica 10

存在运行时异常,但并非所有"错误"导致运行时异常被抛出.例如,访问一个数组越界或解除引用空指针只是"未定义的行为" - 意味着任何事情都可能发生.除零也属于"未定义"类别.

导致"未定义行为"而非例外的某些操作的基本原理是效率.假设一个越界数组访问需要抛出异常.然后编译器必须为每个数组访问生成代码以检查它是否超出范围,如果是,则抛出异常.这是很多检查,其中大部分是不必要的.相反,编译器所做的只是生成元素访问的指令,假设它在边界内.如果它碰巧超出范围,则发生任何事情(例如分段错误).如果执行检查,可以始终显式编码.

这使得C++比总是进行检查的语言(例如Java或python)更强大,因为您可以选择何时进行检查,何时不进行检查.(另一方面,它使C++不如Java或python安全.这是一种权衡).


至于抛出异常但未在任何地方捕获时会发生什么,通常编译器实现将打印包含异常的错误消息what().在您的示例中不适用,因为没有抛出运行时异常.