义门世家 發表於 2026-3-4 08:45:00

关键字noexcept

<p>c++中通过<code>throw</code>关键字抛出异常,通过<code>try{}catch{}</code>捕获异常,在对应函数后添加<code>throw()</code>指定可以抛出的异常类型</p>
<pre><code class="language-c++">#include&lt;iostream&gt;
using namespace std;

struct MyException {
        MyException(string str) : msg(str) {}
        string msg;
};

void func() throw(int ,double,MyException){
        // throw(int, double, MyException)该函数只允许抛出指定类型的异常   windows中只警告,但是linux中报错
        // 如果throw()括号中什么都没有,就是这个函数不允许抛出异常   
        // 不写throw(...)是指这个函数可以抛出任意类型的异常
        try
        {
                //throw 1;
                throw MyException("string exception!");
        }
        catch (int e)
        {
                cout &lt;&lt; "throw value: " &lt;&lt; e &lt;&lt; endl;
        }
        catch (MyException e) {
                cout &lt;&lt; "Myexpection:" &lt;&lt; e.msg &lt;&lt; endl;
        }
}

int main() {
        func();
        system("pause");
        return 0;
}
</code></pre>
<p>就如上面代码中的例子:<code>func()</code>函数中抛出异常并且捕获,<code>func</code>被限制只能抛出<code>int,double,MyException</code>类型的异常。</p>
<p><code>throw(int, double, MyException)</code>该函数只允许抛出指定类型的异常   在windows中只警告,但是linux中报错</p>
<p>如果<code>throw() </code>括号中什么都没有,就是这个函数不允许抛出异常</p>
<p>不写<code>throw(...)</code>是指这个函数可以抛出任意类型的异常</p>
<p><strong>C++11新增了noexcept关键字</strong></p>
<pre><code class="language-c++">#include&lt;iostream&gt;
using namespace std;

struct MyException {
        MyException(string str) : msg(str) {}
        string msg;
};

void func() noexcept(true){
        // 在c++11中使用noexcept代替throw()表示这个函数不允许抛出异常,需要抛出异常只需要去掉关键字noexcept即可
        // noexcept()关键字后面可以加括号,里面写表达式,如果表达式返回值为true:noexcept就有效,该函数不能向外抛异常;返回值为false:noexcept就无效,该函数就可以向外抛异常

                //throw 1;
                throw MyException("string exception!");
}

int main() {
        try
        {
                func();
        }
        catch (int e)
        {
                cout &lt;&lt; "throw value: " &lt;&lt; e &lt;&lt; endl;
        }
        catch (MyException e) {
                cout &lt;&lt; "Myexpection:" &lt;&lt; e.msg &lt;&lt; endl;
        }
        system("pause");
        return 0;
}
</code></pre>
<p>就如上面的例子:在函数<code>func()</code>后面添加<code>noexcept</code>限制该函数向外不能抛出异常</p>
<p><code>noexcept()</code>关键字后面可以加括号,里面写表达式,如果表达式返回值为<code>true</code>:<code>noexcept(true)</code>就有效,该函数不能向外抛异常;返回值为<code>false</code>:<code>noexcept(false)</code>就无效,该函数就可以向外抛异常。</p>
<p>不带括号的<code>noexcept</code>相当于noexcept(true),即不会抛出异常。</p>
<p><code>noexcept(表达式)</code>用在模板中,限制模板中的类型,但是也不常用</p><br><br>
来源:https://www.cnblogs.com/ggkx/p/19666121
頁: [1]
查看完整版本: 关键字noexcept