异常.尝试 - 捕获块

Exceptions. Try - catch block

本文关键字:尝试 异常      更新时间:2023-10-16

我得到了以下代码:

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;