我收到了以下代码:
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向用户提供有关它的信息。
我的问题:虽然我抓住所有异常,因此它们被认为是处理的,但我的程序在运行时仍然终止,这与我期望的行为相矛盾:它应该继续工作因为处理了所有生成的异常。这有什么不对?
答案 0 :(得分:3)
如果object是指针且未初始化,则此类对象的使用为undefined behaviour
。您无法通过exception handling
(按标准)处理此类指针的使用。默认情况下仅初始化为0,并在使用前验证指针不是null
。
答案 1 :(得分:2)
在Windows环境中,从技术上讲,您可以捕获这样的低级异常(取消引用null /未初始化的指针) - SEH异常。这是通过使用特定于Microsoft的__try()和__except()语句完成的。
这可能很有用,如果你有一个外部写得不好的库,它会崩溃(跟空指针等),而不是报告错误,即找不到文件时。
但是,正如评论中已经提到的那样,在代码中使用它是不可移植的。它们不能与C ++异常互操作。因此,即使你决定使用它们,你最终会得到2个异常处理机制的spagetti ......可能是一个糟糕的设计)
但是,如果您的代码依赖于错误报告的异常处理,您可以始终进行空检查并在失败时抛出自定义异常:if(pointer==NULL) throw something;