如果条件满足或发生错误

时间:2016-10-18 05:54:47

标签: c++ c++11 exception

我有以下情况:

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()
  4. 我的问题:

    1. 这个设计不好吗?我觉得我使用异常错误。
    2. 是否有可能以某种方式合并它们:
    3. 理论代码:

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

3 个答案:

答案 0 :(得分:2)

我建议这样的事情

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
}

这会尝试保持您的应用程序的自然流量超出特殊情况,并以自己独特的方式处理这两个失败,同时仍然将它们汇集到一个连续的案例中。

答案 1 :(得分:1)

您可以包装方法:

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);
}

答案 2 :(得分:0)

就个人而言,我会选择以下内容:

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

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

要严格回答你的问题,不,不,你所提出的问题是不可能的,因为例外情况如何起作用。你需要做这样的事情(或你建议的解决方案)。