"try catch(...)"可以在 C++ 中捕获哪些异常?

what exceptions can "try catch(...)" catch in c++?

本文关键字:异常 catch try C++      更新时间:2023-10-16

代码

    try{
        memcpy(p, buf, l);
    }
    catch (...){
        ofstream f("memcpy.error");
        f << "memcpy.error";
    }

如果 p 为空,memcpy 将抛出异常,但 catch(...抓不住。那么,在 c++ 中,try catch(...) 实际上做了什么?

在问题被标记为 [visual-studio] 和 [winapi] 的上下文中回答。

try/catch块捕获C++异常,而具有 NULL 目标的memcpy会引发 Win32 结构化异常

您可以使用__try/__except块(结构化异常处理)捕获这些异常。

或者,您可以将它们转换为可通过_set_se_translator在C++ try/catch块中捕获C++异常。

re

"

"try catch(...)"在 C++ 中可以捕获哪些异常?

它可以捕获C++ throw产生的任何异常。

顺便注意一下,省略号...需要是三个句点,而不是 Unicode 省略号字符,否则编译器会窒息!


重新代码

buf = nullptr;
try{
    memcpy(p, buf, l);
}
catch (...){
    ofstream f("memcpy.error");
    f << "memcpy.error";
}

这里的memcpy调用具有正式的未定义行为

但是,特定的C++实现可以定义任何行为,包括正式的 UB,编译器 Visual C++ 可能会这样做,可以使用特殊选项。但是,Microsoft的memcpy文档没有提到这种更明确定义的行为。

第三方面,未定义的行为包括您可能会获得一些错误预期的行为,例如执行进入 catch 子句。


在1990年代,Microsoft的Visual C++会在catch(...)中捕获Windows SEH异常(一种较低级别的异常)。例如,您可以通过取消引用空指针来获取 SEH 异常,这可能会发生在memcpy调用中。令人高兴的是,编译器不再捕获此类异常作为默认值,但您可以使用 _set_se_translator 函数指定该行为。

如果p为 null,memcpy将引发异常。

不對。如果任一指针为 null,则为未定义的行为。由于 undefined 是"undefined",因此当它发生时(以非实现依赖的方式),您无能为力。