例外。尝试 - 抓住阻止

时间:2012-08-14 10:23:31

标签: c++ exception exception-handling try-catch

我收到了以下代码:

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向用户提供有关它的信息。

我的问题:虽然我抓住所有异常,因此它们被认为是处理的,但我的程序在运行时仍然终止,这与我期望的行为相矛盾:它应该继续工作因为处理了所有生成的异常。这有什么不对?

2 个答案:

答案 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;