C ++是否有办法忽略函数中的异常?

时间:2017-04-16 13:52:52

标签: c++ exception-handling

我创建了一个抛出异常的函数,但在某些情况下我希望它只是忽略这个异常。

我这样写了我的代码,但它不太优雅:

try {
    myFunction();
} catch (...) {}

C ++是否有另外一种方式来写这个?

6 个答案:

答案 0 :(得分:2)

不,这就是你写它的方式。

它本身并不坏,但是如果您发现您的代码由于您使用此构造的次数而变得丑陋,那么这可能是您的信号。重新使用它。

我发现自己偶尔会忽略异常,但如果它是"规范"对你而言,你的设计可能出现问题。

答案 1 :(得分:2)

不,没有。

你可以遵循标准在这种情况下的做法,即将函数重载两次,一次使用std::nothrow_t,一次不使用。使用后者来包装第一个

std::error_code my_function(std::nothrow_t) noexcept;
void my_function(); //throws

答案 2 :(得分:0)

您可以编写这样的禁止包装模板方法:

#include <utility>

template< typename Callable, typename... Arguments > void
Ingnore_Exceptions(Callable && method, Arguments && ... arguments) noexcept
{
    try
    {
        method(::std::forward< Arguments >(arguments)...);
    }
    catch(...)
    {
        //  Do nothing.
    }
}

void
May_Throw(int, char const *)
{
    throw(-1);
}

int
main(int, char**)
{
    Ingnore_Exceptions(May_Throw, 42, "whatever");
    return(0);
}

答案 3 :(得分:0)

正确的方法是

try 
{
  MyFunction () ;
}
catch (ExpectedExceptionType &e)
{
  // Do nothing
}

答案 4 :(得分:0)

我正在使用下面的宏:

#define IGNORE_EXCEPTIONS(stmt) \
try {                           \
  stmt                          \
} catch (...) {                 \
}

您可以像这样将语句传递给宏:

IGNORE_EXCEPTIONS(delta();
                  gamma();)

上面的宏扩展为:

try { delta();gamma(); } catch (...) { }

如果要在try块中使用变量,则必须在调用宏之前声明它们:

double res = 0.0;
IGNORE_EXCEPTIONS(res = delta();)
// Use res variable here. Do not forget res variable may not be changed in try block 

答案 5 :(得分:-1)

我们可以直接忽略该异常。如果你想忽略异常

try
{
   myFunction();
}
catch(Exception)
{}

它将捕获所有异常,并且由于空catch块而不执行任何操作,并且您的忽略条件得到满足。