【问题标题】:If a condition satisfied or an error happened如果条件满足或发生错误
【发布时间】:2016-10-18 05:54:46
【问题描述】:

我有以下情况:

try{
    auto result = do_something(some_input); //do_something() may throw exceptions 
    if (result == bad){
        do_something_else(some_input);
    }
}
catch(...){
     do_something_else(some_input);
}

一些解释:

  1. do_something() 返回 bad 如果过程成功但过程的准确性不是那么好(计算机视觉过程)。
  2. do_something() 如果由于缺少某些信息或输入非常错误而无法处理数据,则抛出异常。
  3. 在 1 和 2 中,我希望流程转到另一个方法,即 do_something_else()

我的问题:

  1. 这个设计不好吗?我觉得我使用异常是错误的。
  2. 是否可以通过以下方式合并它们:

理论代码:

auto result = do_something(some_input); //do_something() may throw exceptions 
if (result == bad OR exception was thrown){
    do_something_else(some_input);
}

【问题讨论】:

  • result == bad 可以扔,有帮助吗?
  • @JanGroothuijse 我明白了.. 这可能会有所帮助。谢谢
  • @HumamHelfawi @你在代码中的哪个位置有这个?我的意思是其他类是否显式调用此代码(函数)?
  • @SupunWijerathne 为了简单起见让我们主要说一下
  • @HumamHelfawi 你在 doSome() 和 doSomeOther() 里面有什么样的东西(他们做了什么)?我认为不仅仅是异常处理,您的设计也有问题。 :))

标签: c++ c++11 exception


【解决方案1】:

我建议这样的事情

bool suceeded = false;

try 
{ 
   auto result = do_something
   if (result != bad)
   {
        succeeded = true;
   }

}
catch (specific_exceptions)
{
   // Log or do something useful here
}

if (!succeeded)
{
  do_something_else
}
else 
{
    use result
}

这试图使您的应用程序的自然流程远离异常情况,并以各自独特的方式处理这两个故障,同时仍将它们集中到一个持续的情况下。

【讨论】:

    【解决方案2】:

    你可以包装方法:

    auto try_do_something(SomeInputType& someinput) noexcept
    {
        try {
            return do_something(some_input); //do_something() may throw exceptions 
        } catch (...) {
            // extra logging ?
            return bad;
        }
    }
    

    然后

    if (try_do_something(some_input) == bad) {
        do_something_else(some_input);
    }
    

    【讨论】:

      【解决方案3】:

      就个人而言,我会选择类似的东西:

      try {
          auto result = do_something(some_input);
          if (result == bad) throw BadResultException();
      } catch (...) {
          do_something_else(some_input);
      }
      

      当然,这需要您定义自己的异常类型,但这相当简单。

      但是,要严格回答您的问题,不,由于异常的工作方式,您所问的问题实际上并不可能。你需要做这样的事情(或你提出的解决方案)。

      【讨论】:

      • 基于异常的正常执行流程在某种程度上是不正当的。
      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多