2

我得到以下代码:

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

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

4

2 回答 2

3

如果 object 是指针且未初始化,则此类对象的用法为undefined behaviour. 您无法exception handling(按标准)处理此类指针的使用。默认情况下仅初始化为 0 并验证指针不在null使用前。

于 2012-08-14T10:28:51.257 回答
2

在 Windows 环境中,从技术上讲,您可以捕获像这样的低级异常(取消引用空/未初始化的指针) - SEH 异常。这是通过使用 Microsoft 特定的 __try() 和 __except() 语句来完成的。

这可能很有用,如果你有一个写得不太好的外部库,它会崩溃(跟随空指针等)而不是报告错误,即当找不到文件时。

但是,正如评论中已经提到的,在您的代码中使用它是不可移植的。而且它们不能与 C++ 异常互操作。因此,即使您决定使用它们,您最终也会得到 2 种异常处理机制的意大利面……可能是一个糟糕的设计)

但是,如果您的代码依赖于异常处理来报告错误,您始终可以进行空检查并在失败时抛出自定义异常:if(pointer==NULL) throw something;

于 2012-08-14T11:24:19.867 回答