【问题标题】:How to deal the null pointer without exit?如何在不退出的情况下处理空指针?
【发布时间】:2016-08-10 06:15:33
【问题描述】:

当我得到空指针时,有没有更好的方法来处理空点而不是MessageBox 并退出?我的老师告诉我这不是使用exit() 的好方法。这是我的代码:

CCheckBoxUI *pCbSwitch = static_cast<CCheckBoxUI*> (pItem->FindSubControl(_T("switch")));
    ASSERT(pCbSwitch && "Failed to find contronl");
    if (pCbSwitch == nullptr)
    {
        MessageBox(NULL, _T("Failed to find contronl"), _T("tip"), 0);
        exit(-1);
    }

【问题讨论】:

  • 如果你不想调用exit,就不要。
  • 你已经有了断言。你为什么要仔细检查?
  • 您可以使用return,这样您就可以在退出程序之前返回主函数进行一些清理(关闭文件处理程序等)。或者您可以编写一个错误处理函数来生成消息框、记录错误、进行清理并退出程序。
  • 检查两次显然是错误的。只有一次。至于如何处理失败则由您决定。我们无法为您做出决定。
  • 处理错误的众多方法之一是抛出异常并“捕获”它们。好处是,当它包含在 try {} catch () {} 块中时,您可以停止执行该块,并且可以在 catch() 块中处理异常。

标签: c++ winapi null-pointer


【解决方案1】:

可能最安全的方法是忽略可能的空指针。这是你的控制,知道你在上面放了一个switch元素,所以你知道FindSubControl会成功。 FindSubControl 本身并不知道这一点,这就是它记录可能返回空指针的原因。

当然,您可能有一个错误,但这就是您在调试版本中使用断言的原因。

【讨论】:

    【解决方案2】:

    pItem-&gt;FindSubControl(_T("switch"))真的会失败吗?

    除非您没有其他功能添加或删除子控件...唯一的失败可能是控件名称中的拼写错误。

    这不是“正常行为”,而是您的调试版本通过断言捕获的错误。 修正错误后,不可能出现故障,因此没有其他检查意义。

    除非...您的内存空间非常有限,可能是框架无法创建控件,因此您无法获取它。但这是您在创建子控件时已经知道的情况。但在那种情况下……甚至显示一个消息框都是不可能的!

    无论如何,如果要防御e优雅退出,不要调用exit,而是抛出异常。您可以在调用者(或 main)中捕获它并以清理的方式退出。

    【讨论】:

    • “你可以在调用者(或main)中捕获它并以清理的方式退出。” - 或者不要捕获它并以受控方式退出一样多。
    • @IInspectable:当然。问题是你想对用户“公平”多少。一个没有消息而关闭的 GUI 应用程序会将用户设置为 WTF 模式!
    • 以受控方式关闭并不意味着在没有任何反馈的情况下立即关闭。例如,您可以设置自己的终止处理程序 (std::set_terminate)。在 Windows 上,您可以设置未处理的异常过滤器 (SetUnandledExceptionFilter),并获取异常记录以写入有意义的转储文件 (MiniDumpWriteDump)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2011-03-19
    • 2012-05-24
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多