【问题标题】:C++ Exception handling without try无需尝试的 C++ 异常处理
【发布时间】:2016-07-19 11:23:46
【问题描述】:

我目前正在尝试为特定类型的硬件异常处理编写函数。

程序应该测试某个条件是否为真,并启动一个简短的紧急程序并最终终止。

这个测试必须经常进行,而且应该很快。

另外,它是在一个项目中实现的,没有任何进一步的异常处理。

因此,将try 语句放在任何地方并不是一个真正的选择。

理想情况下,这样的函数应该是这样的:

void CheckForException(){
  if (Condition == true){
    cout << "The chosen configuration is very dangerous, do something different!" << endl;

    someHardwareFunction();

    someStatementEndingTheProgram;
  }
}

原则上,我正在寻找someStatementEndingTheProgram。

我想,end()、terminate() 之类的都是不好的风格。

在这种情况下,没有try 的throw 语句可以工作吗?

【问题讨论】:

  • return 会结束整个程序,而不仅仅是函数CheckForException()? main() 中的任何内容都不应再执行
  • 它会结束你所在的功能。你可以试试吗?
  • 它确实结束了函数 CheckForException(),但其余代码中该函数之后的任何内容仍会执行。我只是用一个小示例代码对其进行了测试
  • 您可以返回一个变量,告诉您是正常返回还是从异常中返回。所以你可以有int CheckForException() 和return 0 用于异常和return 1 在正常情况下。您只需检查退货并采取相应措施。

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


【解决方案1】:

不回答标题,而是实际问题描述:即使把try的到处都放不是一个选项,你可以将main()函数的完整代码包装在一个try块中并捕获std::exception,所以当CheckForException会抛出,它会被捕获,所以显示消息和退出应用程序很容易。

这种方法的缺点是稍后在您的程序中可能有可能捕获此异常的 try 块,因此应该重新抛出它。

【讨论】:

    【解决方案2】:

    这在您的应用中充满了糟糕的设计。

    如果您想防止 try-catch 的开销,但仍以稳健的方式处理异常/错误条件,则代码必须满足它:实际上用自定义优化处理程序替换异常处理。

    在您的示例中,您有两个基本选择:

    1. 如果someStatementEndingTheProgram 需要进行清理,您可以在该函数的退出点调用exit(),否则只需将其替换为exit()。

    2. 重新设计您的应用程序以处理 CheckForException() 返回状态,并在调用链的上层检查该状态,例如:

    int main()
    {
        bool okay=true;
        while (okay) 
        {
            okay=CheckForException();
            //other code
        }
        if (okay) return 0; else return ERROR_CODE;
    }
    

    这将使您的应用程序正常终止。

    【讨论】:

    • Check 需要经常做,所以第二个选择会有点低效。我喜欢第一个选择,但在这种情况下似乎找不到end()。你的意思是exit()?糟糕设计的糟糕借口:不是我,只是更改了其他人的代码。
    • @chris1992:是的,对不起exit() - 修复。如果它被频繁调用,那么在某个地方(不一定是main())有一个循环可以应用 2. 吗?只是建议选项
    猜你喜欢
    • 2019-07-11
    • 2011-11-23
    • 2018-06-02
    • 2018-02-06
    • 1970-01-01
    • 2014-05-24
    • 2015-04-14
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多