返回

峰回路转:对try...catch...的新认知

后端

前言
工作这几年在项目中用到C++ try...catch...的场景不多,自己一直认为try...catch...很简单,一目了然。然而直到最近在项目中用了一次try...catch...才发现自己之前的理解是错误的,try...catch...远比自己想象的要复杂。


误解之一:try...catch...可以捕捉所有的异常

真相:try...catch...只能捕捉在try块中抛出的异常。
try块之外的异常不会被try...catch...捕捉到。例如,在以下代码中,异常是在try块之外抛出的,因此try...catch...无法捕捉到这个异常:

int main() {
    try {
        // 这里没有抛出异常
    } catch (...) {
        // 这里永远不会被执行
    }
    throw std::runtime_error("这是一个异常"); // 这里抛出异常
    return 0;
}

误解之二:try...catch...可以阻止程序崩溃

真相:try...catch...只能处理异常,但它不能阻止程序崩溃。
如果在try块中抛出异常并且没有被catch块捕获,那么程序将崩溃。例如,在以下代码中,异常在try块中抛出,但没有被catch块捕获,因此程序将崩溃:

int main() {
    try {
        throw std::runtime_error("这是一个异常"); // 这里抛出异常
    }
    catch (...) {
        // 这里永远不会被执行
    }
    return 0;
}

误解之三:try...catch...可以用来处理所有类型的异常

真相:try...catch...只能处理可以被catch块捕获的异常。
有些异常不能被catch块捕获,例如,如果在try块中抛出一个std::bad_alloc异常,那么这个异常不能被catch块捕获,因为std::bad_alloc异常是一个终止异常。在以下代码中,异常是一个std::bad_alloc异常,因此try...catch...无法捕捉到这个异常:

int main() {
    try {
        throw std::bad_alloc(); // 这里抛出一个std::bad_alloc异常
    } catch (...) {
        // 这里永远不会被执行
    }
    return 0;
}

结语

总而言之,try...catch...是一种异常处理结构,用于捕捉和处理代码执行期间可能出现的异常。通过了解try...catch...的处理机制,可以高效地控制代码执行流程,并及时处理可能发生的异常情况。