C++ try..catch don';行不通

C++ try..catch don';行不通,c++,mfc,C++,Mfc,我有一个关于try..catch的方法。 结构如下: try { commands... } catch(...) { ERROR(...); } if(m_pDoc->m_bS = FALSE ) // Check here if AutoLogout event occurred. StartCollect(); } 程序不会进入catch部分,但稍后也不会进入if语句。 有什么问题吗?为什么程序不转到if语句 谢谢只有在发生异常时才会调用catch。至于为什么i

我有一个关于try..catch的方法。 结构如下:

try
{
 commands...

}
catch(...)
{
    ERROR(...);
}
if(m_pDoc->m_bS = FALSE ) // Check here if AutoLogout event occurred.
    StartCollect();
}
程序不会进入catch部分,但稍后也不会进入if语句。 有什么问题吗?为什么程序不转到if语句


谢谢

只有在发生异常时才会调用catch
。至于为什么if语句中的内容没有被调用,或者:

  • 你的条件陈述是错误的
  • 您的捕获也可能引发异常(?)

<>编辑:注意到这是C++。

逐行地检查调试器中的代码块(使用F10键)。您应该看到代码确实到达了
if
语句。

您捕获了什么?您的错误可能不是您试图捕获的错误类型。此外,捕获可能会引发异常


真正的代码和更好的描述也会有所帮助;)

您的
if
语句几乎肯定是错误的。您正在将
FALSE
赋值给
bSilenClose
,然后检查它(FALSE)是否为true,这将导致
if
的主体永远不会执行。在C++中,相等性的测试是== 。此外,正如@Martin York指出的,尾随的
将被视为if的主体。事实上,下面用大括号括起来的代码每次都应该执行

if(m_pDoc->m_bSilenClose = FALSE );
                         ^       ^^^^ This should not be there. (Empty statement after if)
                         ^
                         ^ Assigning FALSE (should be == to test)
                           Condition always FALSE (thus never executes empty statement.
你有打字错误

if(m_pDoc->m_bSilenClose = FALSE ); 
应该是:

if(m_pDoc->m_bSilenClose == FALSE ); 

这就是为什么我更喜欢做

if(FALSE==变量)



当与常量比较时

您使用什么编译器/ide?@user641490您的try中是否有“return”语句?你为什么不试着进入你的代码,看看它什么时候跳出你的函数?VisualStudio2005。我没有返回。不知道这是否相关,但是
try
语句没有关闭(在
catch
语句之前没有关闭
}
),并且您的
if
语句使用
=
而不是
=
。这是if。。太愚蠢了,很难看出错误!谢谢:)什么时候有代码<最后> <代码>块在C++中?*你可能没有捕捉到SUPNNO的异常,我错过了这是C++,修改POST。@安德鲁·卡隆:实际上,如果我记得很好,Visual C++有一个扩展来支持<代码>最后一个< /Cord>关键字。请参阅。@ Eron:最后一个< /Cord>关键字用于微软结构化异常处理,而不是C++异常,无论如何,我逐行运行调试器。它不属于if语句。更重要的是,当我将if语句移动到try部分时,效果很好。(它也不会进入catch)。问题应该是什么try块中最后发生的事情-即它最后做的事情是
返回
继续
中断
等@user641490并发布真正的代码导致解决方案。。。祝贺调试器仍然应该已经到达
if
语句,即使它没有进入该语句。我用真实的代码更新了原始消息。调试时它是否转到try语句的末尾?调试器是否显示抛出的错误?它与catch语句中的类型相同吗?Try/Catch之后的IF语句是否得到计算?许多编译器(例如g++-Wall)对此都有警告,以帮助防止在编译时出现问题。@Martin York感谢Catch,我甚至没有注意到终止的
 @ USSR141490:因此,从现在开始尝试将常量值作为比较的L值,如果这样做,即使忘记在操作数的中间放置“==”,也会得到编译错误,这将不再发生。一些示例:“如果(FALSE==m_pDoc->m_bS){/*something…*/}///如果(NULL==sometptr){/*something*/}”,这样做,您将不会得到这样的逻辑错误,而是编译错误@Parsa Jamshidi,@Dennis I个人实际上没有这样做,因为我发现
if
语句在变量位于左侧时读起来更清晰/自然。大多数编译器都会在赋值构造上发出警告(如果愿意,您可以使用将警告视为错误),这是捕获赋值错误情况所需的全部。它称为yoda条件,如果值为false,则必须进行检查。还请注意“;”在那里的尽头。