summaryrefslogtreecommitdiff
path: root/doc/html/container/exception_handling.html
blob: c8b4c62e26bbbc0d8d98b064390da6330787c4f1 (plain)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Boost.Container and C++ exceptions</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../container.html" title="Chapter&#160;9.&#160;Boost.Container">
<link rel="prev" href="main_features.html" title="Main features">
<link rel="next" href="non_standard_containers.html" title="Non-standard containers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="main_features.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../container.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="non_standard_containers.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="container.exception_handling"></a><a class="link" href="exception_handling.html" title="Boost.Container and C++ exceptions">Boost.Container and C++ exceptions</a>
</h2></div></div></div>
<p>
      In some environments, such as game development or embedded systems, C++ exceptions
      are disabled or a customized error handling is needed. According to document
      <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html" target="_top">N2271
      EASTL -- Electronic Arts Standard Template Library</a> exceptions can be
      disabled for several reasons:
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>Exception handling incurs some kind of cost in all compiler
          implementations, including those that avoid the cost during normal execution.
          However, in some cases this cost may arguably offset the cost of the code
          that it is replacing.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>Exception handling is often agreed to be a superior solution
          for handling a large range of function return values. However, avoiding
          the creation of functions that need large ranges of return values is superior
          to using exception handling to handle such values.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>Using exception handling correctly can be difficult in
          the case of complex software.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>The execution of throw and catch can be significantly
          expensive with some implementations.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>Exception handling violates the don't-pay-for-what-you-don't-use
          design of C++, as it incurs overhead in any non-leaf function that has
          destructible stack objects regardless of whether they use exception handling.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>The approach that game software usually takes is to avoid
          the need for exception handling where possible; avoid the possibility of
          circumstances that may lead to exceptions. For example, verify up front
          that there is enough memory for a subsystem to do its job instead of trying
          to deal with the problem via exception handling or any other means after
          it occurs.</em></span></span>&#8221;</span>
        </li>
<li class="listitem">
          <span class="quote">&#8220;<span class="quote"><span class="emphasis"><em>However, some game libraries may nevertheless benefit
          from the use of exception handling. It's best, however, if such libraries
          keep the exception handling internal lest they force their usage of exception
          handling on the rest of the application.</em></span></span>&#8221;</span>
        </li>
</ul></div>
<p>
      In order to support environments without C++ exception support or environments
      with special error handling needs, <span class="bold"><strong>Boost.Container</strong></span>
      changes error signalling behaviour when <code class="computeroutput"><span class="identifier">BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS</span></code>
      or <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code> is defined.
      The former shall be defined by the user and the latter can be either defined
      by the user or implicitly defined by <span class="bold"><strong>Boost.Confg</strong></span>
      when the compiler has been invoked with the appropriate flag (like <code class="computeroutput"><span class="special">-</span><span class="identifier">fno</span><span class="special">-</span><span class="identifier">exceptions</span></code> in GCC).
    </p>
<p>
      When dealing with user-defined classes, (e.g. when constructing user-defined
      classes):
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
          If <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code>
          is defined, the library avoids using <code class="computeroutput"><span class="keyword">try</span></code>/<code class="computeroutput"><span class="keyword">catch</span></code>/<code class="computeroutput"><span class="keyword">throw</span></code>
          statements. The class writer must handle and propagate error situations
          internally as no error will be propagated through <span class="bold"><strong>Boost.Container</strong></span>.
        </li>
<li class="listitem">
          If <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code>
          is <span class="bold"><strong>not</strong></span> defined, the library propagates
          exceptions offering the exception guarantees detailed in the documentation.
        </li>
</ul></div>
<p>
      When the library needs to throw an exception (such as <code class="computeroutput"><span class="identifier">out_of_range</span></code>
      when an incorrect index is used in <code class="computeroutput"><span class="identifier">vector</span><span class="special">::</span><span class="identifier">at</span></code>), the
      library calls a throw-callback declared in <code class="computeroutput"><a class="link" href="../boost_container_header_reference.html#header.boost.container.throw_exception_hpp" title="Header &lt;boost/container/throw_exception.hpp&gt;">boost/container/throw_exception.hpp</a></code>:
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
          If <code class="computeroutput"><span class="identifier">BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS</span></code>
          is defined, then the programmer must provide its own definition for all
          <code class="computeroutput"><span class="identifier">throw_xxx</span></code> functions. Those
          functions can't return, they must throw an exception or call <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span></code> or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span></code>.
        </li>
<li class="listitem">
          Else if <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code>
          is defined, a <code class="computeroutput"><span class="identifier">BOOST_ASSERT_MSG</span></code>
          assertion is triggered (see <a href="http://www.boost.org/libs/utility/assert.html" target="_top">Boost.Assert</a>
          for more information). If this assertion returns, then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span></code>
          is called.
        </li>
<li class="listitem">
          Else, an appropriate standard library exception is thrown (like <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span></code>).
        </li>
</ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2009-2015 Ion Gaztanaga<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="main_features.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../container.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="non_standard_containers.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>