2012-08-14 77 views
2

我得到了下面的代码:例外。尝试 - 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的方式向用户提供相关信息。我的程序仍然在运行期间终止,这与我期望的行为相矛盾:它应该继续工作,因为所有生成的异常被处理。这里有什么问题?

+0

你得到了什么错误?如果它只是终止,它可能与异常无关。您标记为“不适用”的代码似乎是真正问题的原因。 – SingerOfTheFall 2012-08-14 10:25:15

+4

如果'SetOfObjects'为null或未初始化的指针,则行为是未定义的。 – hmjd 2012-08-14 10:27:36

+0

我得到未处理的异常。不适用的代码真的不适用(我已经评论过,没有任何改变) – 2012-08-14 10:27:41

回答

3

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

+0

对此的警告 - 这会给只使用Windows的开发人员造成很大困惑 - 是Windows *中的一些(所有)版本的C++运行库*实际上捕获低级异常并从它们生成C++异常。你当然不应该期望这个功能可移植! – marko 2012-08-14 10:34:46

+1

http://stackoverflow.com/questions/1823721/how-to-catch-the-null-pointer-exception – Gir 2012-08-14 10:37:31

+0

谢谢你,我最近阅读了B.Straustroup的C++,专门讨论异常,但我没有'在任何关于未定义行为的地方,我可能已经无意识地阅读它,需要阅读。以前我认为当seg故障出现时,它也会通过例外来实现。 – 2012-08-14 10:47:40

2

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

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

但是,正如已经在评论中提到的那样,在你的代码中使用它是不可移植的。它们不能与C++异常互操作。所以,即使你决定使用它们,你最终会得到2个异常处理机制的分歧......很可能是一个糟糕的设计)

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

+0

谢谢。我已经通过默认初始化具有零值的指针来解决我的情况,检查值是否已更改并抛出异常,实际上我是按照您的建议做的。我会阅读__try,虽然它们可以影响程序的可移植性,但感谢您的信息 – 2012-08-14 12:00:47