【问题标题】:Exceptions. Try - catch block例外。尝试 - 捕获块
【发布时间】:2012-08-14 10:23:30
【问题描述】:

我得到以下代码:

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

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

【问题讨论】:

  • 您遇到什么错误?如果它只是终止,它可能与异常无关。您标记为“不适用”的代码似乎是真正问题的原因。
  • 如果 SetOfObjects 为 null 或未初始化的指针,则行为未定义。
  • 我得到未处理的异常。 N/a 代码真的不适用(我已将其注释掉,没有任何改变)
  • 如果你的SetOfObjects 是一个错误的指针,你很可能会遇到段错误。只需检查指针在 if 块中是否有效。
  • @spin_eight 我想提供帮助,但需要更多详细信息。尝试使用 gbd、MSVC++ 等进行调试。也可以尝试在 linux 上获取核心转储,然后再执行类型 ulimit -c unlimited。然后使用gdb &lt;exec file&gt; &lt;core file&gt; 加载核心转储。谢谢

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


【解决方案1】:

如果对象是指针并且它没有被初始化,那么这个对象的用法是undefined behaviour。您无法通过exception handling(按标准)处理此类指针的使用。默认只初始化为0,使用前验证指针不是null

【讨论】:

  • 对此的警告——这会给只使用过 Windows 的开发人员带来很多困惑——Windows 中的某些(所有?)版本的 C++ 运行时 确实低级异常并从中生成 C++ 异常。您当然不应该期望它可以便携!
  • 谢谢,我最近阅读了 B.Straustroup 撰写的 C++ 专门讨论异常的整个部分,但我还没有找到关于未定义行为的任​​何内容,可能是我无意中阅读了它,需要阅读。以前我认为当出现段错误时,它也伴随着异常。
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢。我已经解决了我的情况,默认初始化为零值的指针,检查值是否已更改并抛出我的异常,实际上我按照你的建议做了同样的事情。我将阅读有关 __try 和 __except 虽然它们会影响程序可移植性,所以感谢您提供信息
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多