1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<div class="section-level-extent" id="Exceptions"> <div class="nav-panel"> <p> Next: <a href="synchronization" accesskey="n" rel="next">Synchronization</a>, Previous: <a href="compatibility_005falias" accesskey="p" rel="prev"><code class="code">compatibility_alias</code></a>, Up: <a href="objective-c" accesskey="u" rel="up">GNU Objective-C Features</a> [<a href="index#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="indices" title="Index" rel="index">Index</a>]</p> </div> <h1 class="section" id="Exceptions-1"><span>8.7 Exceptions<a class="copiable-link" href="#Exceptions-1"> ¶</a></span></h1> <p>GNU Objective-C provides exception support built into the language, as in the following example: </p> <div class="example smallexample"> <pre class="example-preformatted" data-language="cpp">@try {
…
@throw expr;
…
}
@catch (AnObjCClass *exc) {
…
@throw expr;
…
@throw;
…
}
@catch (AnotherClass *exc) {
…
}
@catch (id allOthers) {
…
}
@finally {
…
@throw expr;
…
}</pre>
</div> <p>The <code class="code">@throw</code> statement may appear anywhere in an Objective-C or Objective-C++ program; when used inside of a <code class="code">@catch</code> block, the <code class="code">@throw</code> may appear without an argument (as shown above), in which case the object caught by the <code class="code">@catch</code> will be rethrown. </p> <p>Note that only (pointers to) Objective-C objects may be thrown and caught using this scheme. When an object is thrown, it will be caught by the nearest <code class="code">@catch</code> clause capable of handling objects of that type, analogously to how <code class="code">catch</code> blocks work in C++ and Java. A <code class="code">@catch(id …)</code> clause (as shown above) may also be provided to catch any and all Objective-C exceptions not caught by previous <code class="code">@catch</code> clauses (if any). </p> <p>The <code class="code">@finally</code> clause, if present, will be executed upon exit from the immediately preceding <code class="code">@try … @catch</code> section. This will happen regardless of whether any exceptions are thrown, caught or rethrown inside the <code class="code">@try … @catch</code> section, analogously to the behavior of the <code class="code">finally</code> clause in Java. </p> <p>There are several caveats to using the new exception mechanism: </p> <ul class="itemize mark-bullet"> <li>The <samp class="option">-fobjc-exceptions</samp> command line option must be used when compiling Objective-C files that use exceptions. </li>
<li>With the GNU runtime, exceptions are always implemented as “native” exceptions and it is recommended that the <samp class="option">-fexceptions</samp> and <samp class="option">-shared-libgcc</samp> options are used when linking. </li>
<li>With the NeXT runtime, although currently designed to be binary compatible with <code class="code">NS_HANDLER</code>-style idioms provided by the <code class="code">NSException</code> class, the new exceptions can only be used on Mac OS X 10.3 (Panther) and later systems, due to additional functionality needed in the NeXT Objective-C runtime. </li>
<li>As mentioned above, the new exceptions do not support handling types other than Objective-C objects. Furthermore, when used from Objective-C++, the Objective-C exception model does not interoperate with C++ exceptions at this time. This means you cannot <code class="code">@throw</code> an exception from Objective-C and <code class="code">catch</code> it in C++, or vice versa (i.e., <code class="code">throw … @catch</code>). </li>
</ul> </div> <div class="nav-panel"> <p> Next: <a href="synchronization">Synchronization</a>, Previous: <a href="compatibility_005falias"><code class="code">compatibility_alias</code></a>, Up: <a href="objective-c">GNU Objective-C Features</a> [<a href="index#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="indices" title="Index" rel="index">Index</a>]</p> </div><div class="_attribution">
<p class="_attribution-p">
© Free Software Foundation<br>Licensed under the GNU Free Documentation License, Version 1.3.<br>
<a href="https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/Exceptions.html" class="_attribution-link">https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/Exceptions.html</a>
</p>
</div>
|