274 lines
31 KiB
HTML
274 lines
31 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>try 块</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_try_catch skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">try 块</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>将一或多个异常处理块(catch 子句)与复合语句关联。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>try</b></code> <span class="t-spar">复合语句</span> <span class="t-spar">处理块序列</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中 <span class="t-spar">处理块序列</span> 是一或多个 <span class="t-spar">处理块</span> 的序列,它有下列语法:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>catch</b></code> <code><b>(</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">类型说明符序列</span> <span class="t-spar">声明符</span> <code><b>)</b></code> <span class="t-spar">复合语句</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>catch</b></code> <code><b>(</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">类型说明符序列</span> <span class="t-spar">抽象声明符</span><span class="t-mark">(可选)</span> <code><b>)</b></code> <span class="t-spar">复合语句</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>catch</b></code> <code><b>(</b></code> <code><b>...</b></code> <code><b>)</b></code> <span class="t-spar">复合语句</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">复合语句</span></td>
|
|
<td>-</td>
|
|
<td>花括号环绕的<a href="cpp-language-statements.html#.E5.A4.8D.E5.90.88.E8.AF.AD.E5.8F.A5">语句序列</a></td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 任意数量的<a href="cpp-language-attributes.html">属性</a>,应用于形参</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">类型说明符序列</span></td>
|
|
<td>-</td>
|
|
<td>形参声明的一部分,与在<a href="cpp-language-function.html">函数</a>形参列表中相同</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">声明符</span></td>
|
|
<td>-</td>
|
|
<td>形参声明的一部分,与在<a href="cpp-language-function.html">函数</a>形参列表中相同</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">抽象声明符</span></td>
|
|
<td>-</td>
|
|
<td>无名形参声明的一部分,与在<a href="cpp-language-function.html">函数</a>形参列表中相同</td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 声明一个具名形参的 catch 子句
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 声明一个无名形参的 catch 子句
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> catch-all 处理块,可被任何异常激活
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span>...<span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* */</span> <span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<dl>
|
|
<dd><span style="font-size:0.7em; line-height:130%">更多关于 throw 表达式的信息见<a href="cpp-language-throw.html">抛出异常</a></span></dd>
|
|
</dl>
|
|
<p>try 块是一条<a href="cpp-language-statements.html">语句</a>,从而能出现于任何语句所能出现处(即作为复合语句中的语句之一,包含函数体复合语句)。有关围绕函数体的 try 块,见<a href="cpp-language-function-try-block.html">函数 try 块</a>。下列描述同时适用于 try 块和<a href="cpp-language-function-try-block.html">函数 try 块</a>。</p>
|
|
<p>catch 子句的形参(<span class="t-spar">类型说明符序列</span> 与 <span class="t-spar">声明符</span>,或者 <span class="t-spar">类型说明符序列</span> 与 <span class="t-spar">抽象声明符</span>)决定何种类型的异常导致进入此 catch 子句。它不能是<a href="cpp-language-reference.html">右值引用类型</a>、<a href="cpp-language-abstract_class.html">抽象类</a>、<a href="cpp-language-type.html#.E4.B8.8D.E5.AE.8C.E6.95.B4.E7.B1.BB.E5.9E.8B">不完整类型</a>或指向不完整类型的指针(但允许指向(可有 <a href="cpp-language-cv.html">cv</a> 限定的)<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> 的指针)。若形参的类型是数组类型或函数类型,则它被处理成对应的指针类型(类似于<a href="cpp-language-function.html">函数声明</a>)。</p>
|
|
<p>当 <span class="t-spar">复合语句</span> 中的任何语句抛出了类型 <code>E</code> 的异常时,以之对 <span class="t-spar">处理块序列</span> 中的每个 catch 子句的形参类型 <code>T</code>,按 catch 子句的列出顺序进行匹配。若下列任一为真则异常得到匹配:</p>
|
|
<ul>
|
|
<li><code>E</code> 与 <code>T</code> 是同一类型(忽略 <code>T</code> 上的顶层 cv 限定符)</li>
|
|
<li><code>T</code> 是到(可为 cv 限定的)<code>E</code> 的左值引用</li>
|
|
<li><code>T</code> 是 <code>E</code> 的无歧义公开基类</li>
|
|
<li><code>T</code> 是到 <code>E</code> 的无歧义公开基类的引用</li>
|
|
<li><code>T</code> 是(可为 cv 限定的)<code>U</code> <span class="t-rev-inl t-since-cxx14"><span>或 <code>const U&</code></span> <span><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></span></span>,且 <code>U</code> 是指针<span class="t-rev-inl t-since-cxx17"><span>或成员指针</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span>类型,且 <code>E</code> 亦为能通过下列转换中的一或多个转换成 <code>U</code> 的指针<span class="t-rev-inl t-since-cxx17"><span>或成员指针</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span>类型</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>并非到指向私有、受保护或有歧义基类指针的<a href="cpp-language-implicit_conversion.html#.E6.8C.87.E9.92.88.E8.BD.AC.E6.8D.A2">指针转换</a></li>
|
|
<li><a href="cpp-language-implicit_conversion.html#.E9.99.90.E5.AE.9A.E6.80.A7.E8.BD.AC.E6.8D.A2">限定性转换</a></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-language-implicit_conversion.html#.E5.87.BD.E6.95.B0.E6.8C.87.E9.92.88.E8.BD.AC.E6.8D.A2">函数指针转换</a></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li><code>T</code> 是指针或成员指针<span class="t-rev-inl t-since-cxx14"><span>,或 const 指针的引用</span> <span><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></span></span>,而 <code>E</code> 是 <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span>.</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span>
|
|
f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-overflow_error.html"><span class="kw772">std::<span class="me2">overflow_error</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 若 f() 抛出 std::overflow_error 则执行之(“相同类型”规则)</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-runtime_error.html"><span class="kw770">std::<span class="me2">runtime_error</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 若 f() 抛出 std::underflow_error 则执行之(“基类”规则)</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 若 f() 抛出 std::logic_error 则执行之(“基类”规则)</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span>...<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 若 f() 抛出 std::string 或 int 或任何其他无关类型则执行之</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>全捕获(catch-all)子句 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">catch</span> <span class="br0">(</span>...<span class="br0">)</span></span></span> 匹配任何类型的异常。若存在,则它必须是 <span class="t-spar">处理块序列</span> 中的最后一个 catch 子句。Catch-all 块可用于确保不可能有未捕获异常从提供<a href="cpp-language-exceptions.html">不抛出异常保证</a>的函数逃逸。</p>
|
|
<p>若检测所有 catch 子句后仍无匹配,则到外围的 try 块继续异常的传播,如 <a href="cpp-language-throw.html">throw 表达式</a>中所述。若没有剩下的外围 try 块,则执行 <span class="t-lc"><a href="cpp-error-terminate.html">std::terminate</a></span>(此情况下,由实现定义是否完全进行栈回溯:容许抛出未捕获异常导致程序终止而不调用任何析构函数)。</p>
|
|
<p>当进入一个 catch 子句时,若其形参是异常类型的基类,则它从异常对象的基类子对象进行<a href="cpp-language-copy_initialization.html">复制初始化</a>。否则,它从异常对象复制初始化(这个复制服从<a href="cpp-language-copy_elision.html">复制消除</a>规则)。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span>
|
|
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="br0">(</span><span class="st0">"abc"</span><span class="br0">)</span>.<span class="me1">substr</span><span class="br0">(</span><span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 抛出 std::length_error</span>
|
|
<span class="co1">// } catch (std::exception e) { // 从 std::exception 基类复制初始化</span>
|
|
<span class="co1">// std::cout << e.what(); // 丢失来自 length_error 的信息</span>
|
|
<span class="co1">// }</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span> <span class="co1">// 多态对象基类的引用</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> e.<span class="me1">what</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 打印来自 length_error 的信息</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>若 catch 子句的形参是引用类型,则对它所做的任何更改都会反映到异常对象之中,且若以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">throw</span><span class="sy4">;</span></span></span> 重抛这个异常,则可为另一处理块所观测到。若形参不是引用,则任何对它的更改都是局域的,且其生存期在处理块退出时结束。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>在 catch 子句内,可以使用 <span class="t-lc"><a href="cpp-error-current_exception.html">std::current_exception</a></span> 把异常捕获到一个 <span class="t-lc"><a href="cpp-error-exception_ptr.html">std::exception_ptr</a></span> 之中,而且可以使用 <span class="t-lc"><a href="cpp-error-throw_with_nested.html">std::throw_with_nested</a></span> 来构建嵌套的异常。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><a href="cpp-language-goto.html">goto</a> 和 <a href="cpp-language-switch.html">switch</a> 语句不能用来转移控制进入 try 块以及处理块。</p>
|
|
<p>除了抛出或重抛异常以外,普通的 try 块(非<a href="cpp-language-function-try-block.html">函数 try 块</a>)之后的 catch 子句还可以通过 <a href="cpp-language-return.html">return</a>、<a href="cpp-language-continue.html">continue</a>、<a href="cpp-language-break.html">break</a>、<a href="cpp-language-goto.html">goto</a>,或通过抵达其 <span class="t-spar">复合语句</span> 尾而退出。任何这些情况,都会销毁异常对象(除非存在指代它的 <span class="t-lc"><a href="cpp-error-exception_ptr.html">std::exception_ptr</a></span> 实例)。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>不保证捕捉指针的 catch 子句能够匹配 throw 表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">throw</span> <a href="cpp-types-NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span></span></span>,因为异常对象类型可以是整数类型,但可以确保任何指针或成员指针的 catch 子句能够匹配 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">throw</span> nullptr<span class="sy4">;</span></span></span>。</p>
|
|
<p>若派生类的 catch 子句被置于基类的 catch 子句后,则永远不会执行派生类 catch 子句。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">try</span> <span class="br0">{</span>
|
|
f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 若 f() 抛 std::runtime_error 则执行</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-runtime_error.html"><span class="kw770">std::<span class="me2">runtime_error</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 死代码!</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>若用 <a href="cpp-language-goto.html">goto</a> 退出 try 块,且若这个 <code>goto</code> 所执行的任何块作用域自动变量的析构函数由于抛异常而退出,则那些异常被该变量定义于其中的 try 块所捕捉:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1">label<span class="sy4">:</span>
|
|
<span class="kw1">try</span> <span class="br0">{</span>
|
|
T1 t1<span class="sy4">;</span>
|
|
<span class="kw1">try</span> <span class="br0">{</span>
|
|
T2 t2<span class="sy4">;</span>
|
|
<span class="kw1">if</span><span class="br0">(</span>condition<span class="br0">)</span>
|
|
<span class="kw1">goto</span> label<span class="sy4">;</span> <span class="co1">// 销毁 t2,然后销毁 t1,再跳到 label</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span>...<span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span> <span class="co1">// 捕捉来自 t2 析构函数的异常</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span>...<span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span> <span class="co1">// 捕捉来自 t1 析构函数的异常</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-try.html"><tt>try</tt></a>, <a href="cpp-keyword-catch.html"><tt>catch</tt></a>, <a href="cpp-keyword-throw.html"><tt>throw</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>下列代码演示 <code>try-catch</code> 块的数种用法</p>
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <vector></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw1">try</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Throwing an integer exception...<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">throw</span> <span class="nu0">42</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">" the integer exception was caught, with value: "</span> <span class="sy1"><<</span> i <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw1">try</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Creating a vector of size 5... <span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> v<span class="br0">(</span><span class="nu0">5</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Accessing the 11th element of the vector...<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> v.<span class="me1">at</span><span class="br0">(</span><span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// vector::at() 抛出 std::out_of_range</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&</span> e<span class="br0">)</span> <span class="br0">{</span> <span class="co1">// 按基类的引用捕获</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">" a standard exception was caught, with message '"</span>
|
|
<span class="sy1"><<</span> e.<span class="me1">what</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">"'<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">Throwing an integer exception...
|
|
the integer exception was caught, with value: 42
|
|
Creating a vector of size 5...
|
|
Accessing the 11th element of the vector...
|
|
a standard exception was caught, with message 'out_of_range'</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue98">CWG 98</a></td>
|
|
<td>C++98</td>
|
|
<td>switch 语句可以转移控制进入 try 块以及处理块</td>
|
|
<td>已禁止</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|