• Index

noexcept

Reads: 13

指定符

当你设计的函数绝对不会抛出异常时,应该将函数指定为noexcept

void func(void) noexcept;
void func(void) noexcept
{
}

而且关键字noexcept必须同时作用在函数声明和函数定义上。

或者你可能看到noexcept(true)或者noexcept(false),其实void func(void) noexcept(true);void func(void) noexcept;等价,而void func(void) noexcept(false);void func(void);等价。

基础示例

#include <iostream>
#include <string> // std::stoll

void func(void) noexcept;

int main(void)
{
    try
    {
        func();
    }
    catch (...)
    {
        std::cout << "捕获错误" << std::endl;
    }
    return 0;
}

void func(void) noexcept
{
    std::stoll("error");
}

基础讲解

当运行这个程序时,不会输出捕获错误,而是直接退出程序。因为指定为noexcept的函数里抛出异常,异常不会传递到调用该函数的函数,而是在出现异常的位置处直接终止程序,这样就确保noexcept指定的函数是真的不会抛出异常。

运算符

关键字noexcept除了可以指定函数是否会抛出异常,还可以求一个函数是否抛出异常。

基础示例

#include <iostream>

void func1(void) noexcept;
void func2(void);

int main(void)
{
    std::cout << std::boolalpha;
    std::cout << "func1是不是不会抛出异常:" << noexcept(func1()) << std::endl;
    std::cout << "func2是不是不会抛出异常:" << noexcept(func2()) << std::endl;
    return 0;
}

输出结果:

func1是不是不会抛出异常:true
func2是不是不会抛出异常:false

补充知识

noexcept是从C++11才开始引入的。而之前一般使用如void func(void) throw();这样的形式来说明函数会抛出怎样的异常,当throw()()内不写异常类型就是说明该函数不会抛出异常。而这个throw()只是让调用者知道它是否会抛出异常,如果该函数内抛出异常,程序不会中断,异常还是会一层层地往外抛出。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.