"try catch(...)"可以在 C++ 中捕获哪些异常?
what exceptions can "try catch(...)" catch in c++?
代码
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",因此当它发生时(以非实现依赖的方式),您无能为力。
- 有没有更好的方法来处理异常? try-catch块真的很丑
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- 指定特定异常以使用 catch 停止 GDB
- 无法使用 C++ catch(..) 捕获访问冲突异常
- 具有两个类似catch部分的代码的异常处理行为
- 基类catch不捕获异常,即使它出现在派生类catch之前
- 为什么当我抛出派生类的对象时,基类的 catch 块会捕获异常
- C++ 异常中的 catch(异常)是什么意思?
- 格式化文件异常被 try catch 块忽略
- 从catch块调用异常类中的函数并不是打印从try块传递的值
- 从用catch(..)捕获的异常中获取一些信息
- "try catch(...)"可以在 C++ 中捕获哪些异常?
- MFC TRY CATCH与C++对MFC异常的尝试捕获
- 使用try-Catch异常处理程序和if-else条件检查之间的区别
- catch站点中异常的常见用法是什么
- catch语句如何在没有反射的情况下识别异常类型
- 如何在这个try-show-catch代码中对异常进行排序
- llvm异常;Catch处理程序未处理,未调用清理