异常.尝试 - 捕获块
Exceptions. Try - catch block
我得到了以下代码:
set<Object*>::iterator it;
try
{
for (it = SetOfObjects->begin(); it != SetOfObjects->end(); ++it)
{
//some actions, not applicable to the question
}
}
catch(...)
{
this->m_error_raiser->error_Name = "Station isn`t connected to Object! Use connectToObject method or list of forecast objects is empty";
this->m_error_raiser->error_Number = 101;
//throw (this->m_error_raiser);
}
当未创建 SetOfObjects 的实例并且我尝试遍历该集合时,我遇到了预期的运行时错误。
所以我决定处理该错误,并通过 try catch 向用户提供有关它的信息。
我的问题:尽管我捕获了所有异常,因此它们被视为已处理,但我的程序仍然在运行时终止,这与我期望它的行为相矛盾:它应该继续工作,因为所有生成的异常都已处理。这是怎么回事?
如果对象是指针并且未初始化,则此类对象的用法undefined behaviour
。您无法按exception handling
(按标准)处理此类指针的使用。默认情况下仅初始化为 0,并在使用前验证指针未null
。
在 Windows 环境中,从技术上讲,您可以捕获这样的低级异常(取消引用空/未初始化的指针) - SEH 异常。这是通过使用特定于Microsoft的 __try() 和 __except() 语句来完成的。
如果您有一个外部写得不太好的库,这可能会很有用,它崩溃(遵循空指针等)而不是报告错误,即找不到文件时。
但是,正如注释中已经提到的,在您的代码中使用它不是可移植的。而且它们不能互操作,但C++例外。因此,即使您决定使用它们,您最终也会得到 2 种异常处理机制的 spagetti......可能是一个糟糕的设计)
但是,如果代码依赖于异常处理进行错误报告,则始终可以进行 null 检查并在失败时引发自定义异常:if(pointer==NULL) throw something;
相关文章:
- 尝试使用智能指针时引发异常
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 尝试将数字写入二进制文件时引发异常
- 为什么我尝试在 OpenGL 中加载的 3ds 文件会出现此未经处理的异常?
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 尝试关闭 DesktopWindowXamlSource 时引发的异常
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 当我尝试访问结构类型时,我收到 std::bad_variant_access 异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 为什么C++尝试/捕获没有捕获"pure virtual call"异常?
- 尝试编写我自己的字符串类在 gcc 中出现异常
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 尝试使用 wxWidgets 从 zip 打开不存在的文件时无法捕获的异常
- 异常 尝试初始化动态数组时未处理
- 尝试创建 vkCreateImageView 会导致异常
- ESP8266异常在尝试从字节数组读取float时
- 系统访问出界异常,尝试从flatbuffer的二进制文件访问"LengthofTable"
- 尝试/捕获块上的 G++ 错误为异常
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常