mirror of
https://github.com/boostorg/system.git
synced 2026-06-16 08:52:38 +02:00
Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e367d65b6e | |||
| 5e5cd0fda5 | |||
| a4955ec9c1 | |||
| 0daba59730 | |||
| 9cc189382d | |||
| 41c43b6129 | |||
| 16fc70c76f | |||
| a4b67129ff | |||
| 81619e13c3 | |||
| 41e0404847 | |||
| 829a1320a7 | |||
| 1fab2e71cc | |||
| 54de17d886 | |||
| 855fc96010 | |||
| fe1991c624 | |||
| cd38d2f778 | |||
| 49e2267c3e | |||
| e039a454cf | |||
| 1bb5b95ebd | |||
| c493242855 | |||
| b6ef4ad220 | |||
| efe849862f | |||
| d0fe891bb3 | |||
| 6087f1c529 | |||
| d8d71216e9 | |||
| c62bbe9205 |
+45
-250
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Copyright 2016, 2017 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -8,14 +8,11 @@ sudo: false
|
||||
|
||||
python: "2.7"
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
env:
|
||||
matrix:
|
||||
@@ -28,10 +25,12 @@ matrix:
|
||||
|
||||
include:
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++ CXXSTD=c++03
|
||||
compiler: g++
|
||||
env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++03
|
||||
compiler: g++-4.7
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -40,34 +39,17 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++03
|
||||
compiler: g++-4.8
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++03
|
||||
compiler: g++-4.9
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -76,16 +58,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++03
|
||||
compiler: g++-5
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -94,61 +68,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++03
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
|
||||
compiler: g++-6
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -159,7 +80,7 @@ matrix:
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++03
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -168,46 +89,24 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++11
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-3.5
|
||||
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
- clang-3.5
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.5
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++03
|
||||
compiler: clang++-3.6
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -217,17 +116,8 @@ matrix:
|
||||
- llvm-toolchain-precise-3.6
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.6
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++03
|
||||
compiler: clang++-3.7
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -237,98 +127,32 @@ matrix:
|
||||
- llvm-toolchain-precise-3.7
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.7
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++03
|
||||
compiler: clang++-3.8
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++03
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++1z
|
||||
compiler: clang++-3.9
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.9
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.9
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++03
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -338,53 +162,24 @@ matrix:
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++11
|
||||
compiler: clang++-5.0
|
||||
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-4.0
|
||||
- clang-5.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-4.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-4.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-4.0
|
||||
- llvm-toolchain-trusty-5.0
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
|
||||
|
||||
install:
|
||||
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
|
||||
- cd ..
|
||||
- git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule update --init tools/build
|
||||
- git submodule update --init libs/config
|
||||
@@ -396,8 +191,8 @@ install:
|
||||
|
||||
script:
|
||||
- |-
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
|
||||
- ./b2 libs/system/test toolset=$TOOLSET
|
||||
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
|
||||
- ./b2 libs/system/test toolset=$TOOLSET cxxstd=$CXXSTD
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
+46
-43
@@ -60,8 +60,7 @@
|
||||
<a href="#Class-error_condition-constructors">Class <code>error_condition</code> constructors</a><br>
|
||||
<a href="#Class-error_condition-modifiers">Class <code>error_condition</code> modifiers</a><br>
|
||||
<a href="#Class-error_condition-observers">Class <code>error_condition</code> observers</a><br>
|
||||
<a href="#throws-object"><code>throws</code> object</a><br>
|
||||
<a href="#Semantics-of-throws">Semantics of <code>throws</code> object</a><br>
|
||||
<a href="#Function-boost-throws">Function <code>boost::throws()</code></a><br>
|
||||
<a href="#Non-member-functions">Non-member functions</a><br>
|
||||
<a href="#Header-system_error">Header <boost/system/system_error.hpp></a><br>
|
||||
<a href="#Class-system_error">Class <code>system_error</code></a><br>
|
||||
@@ -81,7 +80,7 @@ noexcept</code> and explicit conversion operators. The actual implementation
|
||||
uses C++11 features only when they are available, and otherwise falls back on
|
||||
C++03 features.</p>
|
||||
<h2><a name="Macros">Macros</a></h2>
|
||||
<p>Users may defined the following macros if desired. Sensible defaults are
|
||||
<p>Users may define the following macros if desired. Sensible defaults are
|
||||
provided, so users may ignore these macros if they prefer.</p>
|
||||
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" height="368">
|
||||
<tr>
|
||||
@@ -110,17 +109,16 @@ provided, so users may ignore these macros if they prefer.</p>
|
||||
facility.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" height="32"><code>BOOST_SYSTEM_NO_DEPRECATED</code></td>
|
||||
<td valign="top" height="32"><code>BOOST_SYSTEM_ENABLE_DEPRECATED</code></td>
|
||||
<td valign="top" height="32">Not defined.</td>
|
||||
<td valign="top" height="32">Deprecated features are excluded.</td>
|
||||
<td valign="top" height="32">Deprecated features are provided for compatibility.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h2><a name="Deprecated-names">Deprecated names</a></h2>
|
||||
<p>In the process of adding Boost.System to C++0x standard library, the C++
|
||||
committee changed some
|
||||
names. To ease transition, Boost.System deprecates the old
|
||||
names, but continues to provide them unless macro <code>BOOST_SYSTEM_NO_DEPRECATED</code>
|
||||
is defined.</p>
|
||||
<p>In the process of adding Boost.System to the C++11 standard library, the
|
||||
C++ committee changed some names. To ease transition, Boost.System deprecates
|
||||
the old names, but will provide them when the macro
|
||||
<code>BOOST_SYSTEM_ENABLE_DEPRECATED</code> is defined.</p>
|
||||
<table border="1" cellpadding="5" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr>
|
||||
<td><b><i>Old usage, now deprecated</i></b></td>
|
||||
@@ -316,8 +314,12 @@ fixed by globally adding () to these names to turn them into function calls.</p>
|
||||
operator<<( basic_ostream<charT,traits>& os, const error_code & ec );
|
||||
|
||||
size_t hash_value( const error_code & ec );
|
||||
}
|
||||
}</pre>
|
||||
|
||||
} // namespace system
|
||||
|
||||
system::error_code & throws();
|
||||
|
||||
} // namespace boost</pre>
|
||||
</blockquote>
|
||||
<p>The value of each<code> errc_t</code> constant shall be the same as the
|
||||
value of the <code><cerrno></code> macro shown in the above synopsis.</p>
|
||||
@@ -644,36 +646,6 @@ observers</a></h3>
|
||||
<code>int</code>) that can occur with <code>bool</code> are not allowed,
|
||||
eliminating some sources of user error. One possible implementation choice for
|
||||
this type is pointer to member. <i>--end note</i> <i>]</i></p>
|
||||
</blockquote>
|
||||
<h2><a name="throws-object"><code>throws</code> object</a></h2>
|
||||
<pre>extern error_code throws;</pre>
|
||||
<p>The predefined <code>error_code</code> object <code>throws</code> is supplied
|
||||
for use as a "throw on error" tag.</p>
|
||||
<h2><a name="Semantics-of-throws">Semantics of <code>throws</code></a> object</h2>
|
||||
<p>Functions that specify an argument in the form <code>error_code& ec=throws</code>,
|
||||
with appropriate namespace qualifiers, have the following error handling
|
||||
semantics:</p>
|
||||
<blockquote>
|
||||
<p><i>Postconditions:</i></p>
|
||||
<blockquote>
|
||||
<p>If <code>&ec != &throws</code> and an error occurred:</p>
|
||||
<ul>
|
||||
<li> <code>ec.value()</code> returns the implementation specific error
|
||||
number for the particular error that occurred.</li>
|
||||
<li><code>ec.category()</code> returns the <code>
|
||||
<a href="#Class-error_category">error_category</a></code> for <code>ec.value()</code>.</li>
|
||||
</ul>
|
||||
<p>if <code>&ec != &throws</code> and an error did not occur, <code>ec.clear()</code>.</p>
|
||||
</blockquote>
|
||||
<p><i>Throws:</i></p>
|
||||
<blockquote>
|
||||
<p>If an error occurs and <code>&ec == &throws</code>, throws an exception of type
|
||||
<code><a href="#Class-system_error">system_error</a></code> or of a type
|
||||
derived from <code><a href="#Class-system_error">system_error</a></code>. The
|
||||
exception's <code>code()</code> member function returns a reference to an
|
||||
<code>error_code</code> object with the behavior specified in <i>
|
||||
Postconditions</i>.</p>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
<h2><a name="Non-member-functions">Non-member functions</a></h2>
|
||||
<pre>bool operator==( const error_code & lhs, const error_code & rhs ) noexcept;</pre>
|
||||
@@ -736,6 +708,37 @@ bool operator!=( const error_condition & condition, const error_code & c
|
||||
<p><i>Returns: </i> A hash value representing <code>ec</code>.</p>
|
||||
</blockquote>
|
||||
|
||||
<h2><a name="Function-boost-throws">Function <code>boost::throws()</code></a></h2>
|
||||
|
||||
<pre>system::error_code& throws();</pre>
|
||||
<blockquote>
|
||||
<p><i>Returns:</i> A <code>system::error_code</code> reference
|
||||
for use in some user-defined function signature as a "throw on error" tag.</p>
|
||||
<p><i>Remark:</i> The only valid use for the returned reference is to test its
|
||||
address for equality or inequality to the address of the reference returned by
|
||||
another call to throws(). The returned reference itself has been poisoned so
|
||||
that an attempt to dereference it will fail.</p>
|
||||
<p>[<i>Example: </i>Example of a function that uses the <code>throws()</code> idiom:</p>
|
||||
<blockquote>
|
||||
<pre>int divide(int dividend, int divisor,
|
||||
boost::system::error_code& ec = boost::throws())
|
||||
{
|
||||
if (divisor == 0) // is there an error?
|
||||
{
|
||||
if (&ec == &boost::throws()) // throw on error
|
||||
throw "oops!"; // whatever exception you prefer
|
||||
ec = error_code(EDOM, generic_category()); // report error via error_code
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (&ec != &boost::throws()) // error reporting via error_code
|
||||
ec.clear();
|
||||
return dividend / divisor;
|
||||
}</pre>
|
||||
</blockquote>
|
||||
<p>— <i>end Example</i>]</p>
|
||||
</blockquote>
|
||||
|
||||
<h2><a name="Header-system_error">Header <boost/system/system_error.hpp></a></h2>
|
||||
|
||||
<h3><a name="Class-system_error">Class <code>
|
||||
@@ -818,7 +821,7 @@ application program interfaces.</p>
|
||||
<hr>
|
||||
|
||||
<p>Revised
|
||||
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%B %d, %Y" startspan -->January 06, 2014<!--webbot bot="Timestamp" endspan i-checksum="31400" --> </font>
|
||||
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%B %d, %Y" startspan -->September 07, 2017<!--webbot bot="Timestamp" endspan i-checksum="38006" --> </font>
|
||||
</p>
|
||||
|
||||
<p>© Copyright Beman Dawes, 2006, 2007, 2008, 2013</p>
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
#include <cstring> // for strerror/strerror_r
|
||||
|
||||
# if defined( BOOST_WINDOWS_API )
|
||||
# include <boost/detail/winapi/error_codes.hpp>
|
||||
# include <boost/detail/winapi/error_handling.hpp>
|
||||
# include <boost/detail/winapi/character_code_conversion.hpp>
|
||||
# include <boost/winapi/error_codes.hpp>
|
||||
# include <boost/winapi/error_handling.hpp>
|
||||
# include <boost/winapi/character_code_conversion.hpp>
|
||||
# if !BOOST_PLAT_WINDOWS_RUNTIME
|
||||
# include <boost/system/detail/local_free_on_destruction.hpp>
|
||||
# endif
|
||||
@@ -154,7 +154,6 @@ namespace
|
||||
# endif
|
||||
|
||||
if ( sz > sizeof(buf) ) std::free( bp );
|
||||
sz = 0;
|
||||
return msg;
|
||||
# endif // else POSIX version of strerror_r
|
||||
# endif // else use strerror_r
|
||||
@@ -187,7 +186,7 @@ namespace
|
||||
|
||||
# if defined(BOOST_WINDOWS_API)
|
||||
|
||||
using namespace boost::detail::winapi; // for error codes
|
||||
using namespace boost::winapi; // for error codes
|
||||
|
||||
# endif
|
||||
|
||||
@@ -383,15 +382,15 @@ namespace
|
||||
std::wstring buf(128, wchar_t());
|
||||
for (;;)
|
||||
{
|
||||
boost::detail::winapi::DWORD_ retval = boost::detail::winapi::FormatMessageW(
|
||||
boost::detail::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
|
||||
boost::detail::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
|
||||
boost::winapi::DWORD_ retval = boost::winapi::FormatMessageW(
|
||||
boost::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
|
||||
boost::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
|
||||
NULL,
|
||||
ev,
|
||||
boost::detail::winapi::MAKELANGID_(boost::detail::winapi::LANG_NEUTRAL_,
|
||||
boost::detail::winapi::SUBLANG_DEFAULT_), // Default language
|
||||
boost::winapi::MAKELANGID_(boost::winapi::LANG_NEUTRAL_,
|
||||
boost::winapi::SUBLANG_DEFAULT_), // Default language
|
||||
&buf[0],
|
||||
buf.size(),
|
||||
static_cast<boost::winapi::DWORD_>(buf.size()),
|
||||
NULL
|
||||
);
|
||||
|
||||
@@ -400,8 +399,8 @@ namespace
|
||||
buf.resize(retval);
|
||||
break;
|
||||
}
|
||||
else if (boost::detail::winapi::GetLastError() !=
|
||||
boost::detail::winapi::ERROR_INSUFFICIENT_BUFFER_)
|
||||
else if (boost::winapi::GetLastError() !=
|
||||
boost::winapi::ERROR_INSUFFICIENT_BUFFER_)
|
||||
{
|
||||
return std::string("Unknown error");
|
||||
}
|
||||
@@ -412,9 +411,15 @@ namespace
|
||||
}
|
||||
|
||||
int num_chars = (buf.size() + 1) * 2;
|
||||
boost::detail::winapi::LPSTR_ narrow_buffer =
|
||||
(boost::detail::winapi::LPSTR_)_alloca(num_chars);
|
||||
if (boost::detail::winapi::WideCharToMultiByte(boost::detail::winapi::CP_ACP_, 0,
|
||||
|
||||
boost::winapi::LPSTR_ narrow_buffer =
|
||||
#if defined(__GNUC__)
|
||||
(boost::winapi::LPSTR_)__builtin_alloca(num_chars);
|
||||
#else
|
||||
(boost::winapi::LPSTR_)_alloca(num_chars);
|
||||
#endif
|
||||
|
||||
if (boost::winapi::WideCharToMultiByte(boost::winapi::CP_ACP_, 0,
|
||||
buf.c_str(), -1, narrow_buffer, num_chars, NULL, NULL) == 0)
|
||||
{
|
||||
return std::string("Unknown error");
|
||||
@@ -422,16 +427,16 @@ namespace
|
||||
|
||||
std::string str( narrow_buffer );
|
||||
#else
|
||||
boost::detail::winapi::LPVOID_ lpMsgBuf = 0;
|
||||
boost::detail::winapi::DWORD_ retval = boost::detail::winapi::FormatMessageA(
|
||||
boost::detail::winapi::FORMAT_MESSAGE_ALLOCATE_BUFFER_ |
|
||||
boost::detail::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
|
||||
boost::detail::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
|
||||
boost::winapi::LPVOID_ lpMsgBuf = 0;
|
||||
boost::winapi::DWORD_ retval = boost::winapi::FormatMessageA(
|
||||
boost::winapi::FORMAT_MESSAGE_ALLOCATE_BUFFER_ |
|
||||
boost::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
|
||||
boost::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
|
||||
NULL,
|
||||
ev,
|
||||
boost::detail::winapi::MAKELANGID_(boost::detail::winapi::LANG_NEUTRAL_,
|
||||
boost::detail::winapi::SUBLANG_DEFAULT_), // Default language
|
||||
(boost::detail::winapi::LPSTR_) &lpMsgBuf,
|
||||
boost::winapi::MAKELANGID_(boost::winapi::LANG_NEUTRAL_,
|
||||
boost::winapi::SUBLANG_DEFAULT_), // Default language
|
||||
(boost::winapi::LPSTR_) &lpMsgBuf,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
@@ -439,7 +444,7 @@ namespace
|
||||
if (retval == 0)
|
||||
return std::string("Unknown error");
|
||||
|
||||
std::string str(static_cast<boost::detail::winapi::LPCSTR_>(lpMsgBuf));
|
||||
std::string str(static_cast<boost::winapi::LPCSTR_>(lpMsgBuf));
|
||||
# endif
|
||||
while ( str.size()
|
||||
&& (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
|
||||
@@ -453,7 +458,7 @@ namespace
|
||||
} // unnamed namespace
|
||||
|
||||
|
||||
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
BOOST_SYSTEM_DECL error_code throws; // "throw on error" special error_code;
|
||||
// note that it doesn't matter if this
|
||||
// isn't initialized before use since
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#ifndef BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
|
||||
#define BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
|
||||
|
||||
#include <boost/detail/winapi/local_memory.hpp>
|
||||
#include <boost/winapi/local_memory.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace system {
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
|
||||
~local_free_on_destruction()
|
||||
{
|
||||
boost::detail::winapi::LocalFree(p_);
|
||||
boost::winapi::LocalFree(p_);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace boost
|
||||
|
||||
} // namespace errc
|
||||
|
||||
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
namespace posix = errc;
|
||||
namespace posix_error = errc;
|
||||
# endif
|
||||
@@ -198,7 +198,7 @@ namespace boost
|
||||
#endif
|
||||
// deprecated synonyms ------------------------------------------------------------//
|
||||
|
||||
#ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
#ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
inline const error_category & get_system_category() { return system_category(); }
|
||||
inline const error_category & get_generic_category() { return generic_category(); }
|
||||
inline const error_category & get_posix_category() { return generic_category(); }
|
||||
@@ -210,6 +210,12 @@ namespace boost
|
||||
= system_category();
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
// 'this' : used in base member initializer list
|
||||
#pragma warning(disable: 4355)
|
||||
#endif
|
||||
|
||||
// class error_category ------------------------------------------------//
|
||||
|
||||
class error_category : public noncopyable
|
||||
@@ -328,6 +334,10 @@ namespace boost
|
||||
{ return std::less<const error_category*>()( this, &rhs ); }
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
// class error_condition ---------------------------------------------------------//
|
||||
|
||||
// error_conditions are portable, error_codes are system or library specific
|
||||
@@ -523,7 +533,7 @@ namespace boost
|
||||
};
|
||||
|
||||
// predefined error_code object used as "throw on error" tag
|
||||
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
BOOST_SYSTEM_DECL extern error_code throws;
|
||||
# endif
|
||||
|
||||
@@ -532,8 +542,9 @@ namespace boost
|
||||
// "throws" function in namespace boost rather than namespace boost::system.
|
||||
|
||||
} // namespace system
|
||||
|
||||
namespace detail { inline system::error_code * throws() { return 0; } }
|
||||
|
||||
namespace detail
|
||||
{
|
||||
// Misuse of the error_code object is turned into a noisy failure by
|
||||
// poisoning the reference. This particular implementation doesn't
|
||||
// produce warnings or errors from popular compilers, is very efficient
|
||||
@@ -541,8 +552,17 @@ namespace boost
|
||||
// from order of initialization problems. In practice, it also seems
|
||||
// cause user function error handling implementation errors to be detected
|
||||
// very early in the development cycle.
|
||||
inline system::error_code* throws()
|
||||
{
|
||||
// See github.com/boostorg/system/pull/12 by visigoth for why the return
|
||||
// is poisoned with (1) rather than (0). A test, test_throws_usage(), has
|
||||
// been added to error_code_test.cpp, and as visigoth mentioned it fails
|
||||
// on clang for release builds with a return of 0 but works fine with (1).
|
||||
return reinterpret_cast<system::error_code*>(1);
|
||||
}
|
||||
}
|
||||
|
||||
inline system::error_code & throws()
|
||||
inline system::error_code& throws()
|
||||
{ return *detail::throws(); }
|
||||
|
||||
namespace system
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace boost
|
||||
};
|
||||
} // namespace linux_error
|
||||
|
||||
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
namespace Linux = linux_error;
|
||||
# endif
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
//#include <winerror.h>
|
||||
//#endif
|
||||
|
||||
#include <boost/detail/winapi/error_codes.hpp>
|
||||
#include <boost/winapi/error_codes.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -47,59 +47,59 @@ namespace boost
|
||||
{
|
||||
success = 0,
|
||||
// These names and values are based on Windows winerror.h
|
||||
invalid_function = boost::detail::winapi::ERROR_INVALID_FUNCTION_,
|
||||
file_not_found = boost::detail::winapi::ERROR_FILE_NOT_FOUND_,
|
||||
path_not_found = boost::detail::winapi::ERROR_PATH_NOT_FOUND_,
|
||||
too_many_open_files = boost::detail::winapi::ERROR_TOO_MANY_OPEN_FILES_,
|
||||
access_denied = boost::detail::winapi::ERROR_ACCESS_DENIED_,
|
||||
invalid_handle = boost::detail::winapi::ERROR_INVALID_HANDLE_,
|
||||
arena_trashed = boost::detail::winapi::ERROR_ARENA_TRASHED_,
|
||||
not_enough_memory = boost::detail::winapi::ERROR_NOT_ENOUGH_MEMORY_,
|
||||
invalid_block = boost::detail::winapi::ERROR_INVALID_BLOCK_,
|
||||
bad_environment = boost::detail::winapi::ERROR_BAD_ENVIRONMENT_,
|
||||
bad_format = boost::detail::winapi::ERROR_BAD_FORMAT_,
|
||||
invalid_access = boost::detail::winapi::ERROR_INVALID_ACCESS_,
|
||||
outofmemory = boost::detail::winapi::ERROR_OUTOFMEMORY_,
|
||||
invalid_drive = boost::detail::winapi::ERROR_INVALID_DRIVE_,
|
||||
current_directory = boost::detail::winapi::ERROR_CURRENT_DIRECTORY_,
|
||||
not_same_device = boost::detail::winapi::ERROR_NOT_SAME_DEVICE_,
|
||||
no_more_files = boost::detail::winapi::ERROR_NO_MORE_FILES_,
|
||||
write_protect = boost::detail::winapi::ERROR_WRITE_PROTECT_,
|
||||
bad_unit = boost::detail::winapi::ERROR_BAD_UNIT_,
|
||||
not_ready = boost::detail::winapi::ERROR_NOT_READY_,
|
||||
bad_command = boost::detail::winapi::ERROR_BAD_COMMAND_,
|
||||
crc = boost::detail::winapi::ERROR_CRC_,
|
||||
bad_length = boost::detail::winapi::ERROR_BAD_LENGTH_,
|
||||
seek = boost::detail::winapi::ERROR_SEEK_,
|
||||
not_dos_disk = boost::detail::winapi::ERROR_NOT_DOS_DISK_,
|
||||
sector_not_found = boost::detail::winapi::ERROR_SECTOR_NOT_FOUND_,
|
||||
out_of_paper = boost::detail::winapi::ERROR_OUT_OF_PAPER_,
|
||||
write_fault = boost::detail::winapi::ERROR_WRITE_FAULT_,
|
||||
read_fault = boost::detail::winapi::ERROR_READ_FAULT_,
|
||||
gen_failure = boost::detail::winapi::ERROR_GEN_FAILURE_,
|
||||
sharing_violation = boost::detail::winapi::ERROR_SHARING_VIOLATION_,
|
||||
lock_violation = boost::detail::winapi::ERROR_LOCK_VIOLATION_,
|
||||
wrong_disk = boost::detail::winapi::ERROR_WRONG_DISK_,
|
||||
sharing_buffer_exceeded = boost::detail::winapi::ERROR_SHARING_BUFFER_EXCEEDED_,
|
||||
handle_eof = boost::detail::winapi::ERROR_HANDLE_EOF_,
|
||||
handle_disk_full= boost::detail::winapi::ERROR_HANDLE_DISK_FULL_,
|
||||
rem_not_list = boost::detail::winapi::ERROR_REM_NOT_LIST_,
|
||||
dup_name = boost::detail::winapi::ERROR_DUP_NAME_,
|
||||
bad_net_path = boost::detail::winapi::ERROR_BAD_NETPATH_,
|
||||
network_busy = boost::detail::winapi::ERROR_NETWORK_BUSY_,
|
||||
invalid_function = boost::winapi::ERROR_INVALID_FUNCTION_,
|
||||
file_not_found = boost::winapi::ERROR_FILE_NOT_FOUND_,
|
||||
path_not_found = boost::winapi::ERROR_PATH_NOT_FOUND_,
|
||||
too_many_open_files = boost::winapi::ERROR_TOO_MANY_OPEN_FILES_,
|
||||
access_denied = boost::winapi::ERROR_ACCESS_DENIED_,
|
||||
invalid_handle = boost::winapi::ERROR_INVALID_HANDLE_,
|
||||
arena_trashed = boost::winapi::ERROR_ARENA_TRASHED_,
|
||||
not_enough_memory = boost::winapi::ERROR_NOT_ENOUGH_MEMORY_,
|
||||
invalid_block = boost::winapi::ERROR_INVALID_BLOCK_,
|
||||
bad_environment = boost::winapi::ERROR_BAD_ENVIRONMENT_,
|
||||
bad_format = boost::winapi::ERROR_BAD_FORMAT_,
|
||||
invalid_access = boost::winapi::ERROR_INVALID_ACCESS_,
|
||||
outofmemory = boost::winapi::ERROR_OUTOFMEMORY_,
|
||||
invalid_drive = boost::winapi::ERROR_INVALID_DRIVE_,
|
||||
current_directory = boost::winapi::ERROR_CURRENT_DIRECTORY_,
|
||||
not_same_device = boost::winapi::ERROR_NOT_SAME_DEVICE_,
|
||||
no_more_files = boost::winapi::ERROR_NO_MORE_FILES_,
|
||||
write_protect = boost::winapi::ERROR_WRITE_PROTECT_,
|
||||
bad_unit = boost::winapi::ERROR_BAD_UNIT_,
|
||||
not_ready = boost::winapi::ERROR_NOT_READY_,
|
||||
bad_command = boost::winapi::ERROR_BAD_COMMAND_,
|
||||
crc = boost::winapi::ERROR_CRC_,
|
||||
bad_length = boost::winapi::ERROR_BAD_LENGTH_,
|
||||
seek = boost::winapi::ERROR_SEEK_,
|
||||
not_dos_disk = boost::winapi::ERROR_NOT_DOS_DISK_,
|
||||
sector_not_found = boost::winapi::ERROR_SECTOR_NOT_FOUND_,
|
||||
out_of_paper = boost::winapi::ERROR_OUT_OF_PAPER_,
|
||||
write_fault = boost::winapi::ERROR_WRITE_FAULT_,
|
||||
read_fault = boost::winapi::ERROR_READ_FAULT_,
|
||||
gen_failure = boost::winapi::ERROR_GEN_FAILURE_,
|
||||
sharing_violation = boost::winapi::ERROR_SHARING_VIOLATION_,
|
||||
lock_violation = boost::winapi::ERROR_LOCK_VIOLATION_,
|
||||
wrong_disk = boost::winapi::ERROR_WRONG_DISK_,
|
||||
sharing_buffer_exceeded = boost::winapi::ERROR_SHARING_BUFFER_EXCEEDED_,
|
||||
handle_eof = boost::winapi::ERROR_HANDLE_EOF_,
|
||||
handle_disk_full= boost::winapi::ERROR_HANDLE_DISK_FULL_,
|
||||
rem_not_list = boost::winapi::ERROR_REM_NOT_LIST_,
|
||||
dup_name = boost::winapi::ERROR_DUP_NAME_,
|
||||
bad_net_path = boost::winapi::ERROR_BAD_NETPATH_,
|
||||
network_busy = boost::winapi::ERROR_NETWORK_BUSY_,
|
||||
// ...
|
||||
file_exists = boost::detail::winapi::ERROR_FILE_EXISTS_,
|
||||
cannot_make = boost::detail::winapi::ERROR_CANNOT_MAKE_,
|
||||
file_exists = boost::winapi::ERROR_FILE_EXISTS_,
|
||||
cannot_make = boost::winapi::ERROR_CANNOT_MAKE_,
|
||||
// ...
|
||||
broken_pipe = boost::detail::winapi::ERROR_BROKEN_PIPE_,
|
||||
open_failed = boost::detail::winapi::ERROR_OPEN_FAILED_,
|
||||
buffer_overflow = boost::detail::winapi::ERROR_BUFFER_OVERFLOW_,
|
||||
disk_full= boost::detail::winapi::ERROR_DISK_FULL_,
|
||||
broken_pipe = boost::winapi::ERROR_BROKEN_PIPE_,
|
||||
open_failed = boost::winapi::ERROR_OPEN_FAILED_,
|
||||
buffer_overflow = boost::winapi::ERROR_BUFFER_OVERFLOW_,
|
||||
disk_full= boost::winapi::ERROR_DISK_FULL_,
|
||||
// ...
|
||||
lock_failed = boost::detail::winapi::ERROR_LOCK_FAILED_,
|
||||
busy = boost::detail::winapi::ERROR_BUSY_,
|
||||
cancel_violation = boost::detail::winapi::ERROR_CANCEL_VIOLATION_,
|
||||
already_exists = boost::detail::winapi::ERROR_ALREADY_EXISTS_
|
||||
lock_failed = boost::winapi::ERROR_LOCK_FAILED_,
|
||||
busy = boost::winapi::ERROR_BUSY_,
|
||||
cancel_violation = boost::winapi::ERROR_CANCEL_VIOLATION_,
|
||||
already_exists = boost::winapi::ERROR_ALREADY_EXISTS_
|
||||
// ...
|
||||
|
||||
// TODO: add more Windows errors
|
||||
@@ -107,7 +107,7 @@ namespace boost
|
||||
|
||||
} // namespace windows
|
||||
|
||||
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
||||
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
|
||||
namespace windows = windows_error;
|
||||
# endif
|
||||
|
||||
|
||||
@@ -121,4 +121,10 @@ project
|
||||
[ run std_mismatch_test.cpp
|
||||
: : : <link>shared <conditional>@cxx11 : std_mismatch_test_shared_11
|
||||
]
|
||||
[ run header_only_test.cpp
|
||||
: : : <link>static <define>BOOST_NO_ANSI_APIS : header_only_test_no_ansi
|
||||
]
|
||||
;
|
||||
|
||||
# Quick (CI) test
|
||||
run quick.cpp ;
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
// test without deprecated features
|
||||
#define BOOST_SYSTEM_NO_DEPRECATED
|
||||
|
||||
#include <boost/config/warning_disable.hpp>
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
@@ -56,6 +53,53 @@ namespace
|
||||
ss >> s;
|
||||
BOOST_TEST( s == expected );
|
||||
}
|
||||
|
||||
// throws_function_test ------------------------------------------------------------//
|
||||
|
||||
// usage example
|
||||
|
||||
int divide(int dividend, int divisor, boost::system::error_code& ec = boost::throws())
|
||||
{
|
||||
if (divisor == 0) // is there an error?
|
||||
{
|
||||
if (&ec == &boost::throws()) // throw on error
|
||||
throw "oops!"; // whatever exception you prefer
|
||||
ec = error_code(EDOM, generic_category()); // report error via error_code
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (&ec != &boost::throws()) // error reporting via error_code
|
||||
ec.clear();
|
||||
return dividend / divisor;
|
||||
}
|
||||
|
||||
// test usage example
|
||||
|
||||
void test_throws_usage()
|
||||
{
|
||||
std::cout << "Test throws() example and usage...\n";
|
||||
error_code ec;
|
||||
|
||||
// no error tests
|
||||
BOOST_TEST_EQ((divide(10, 2)), 5); // no error, report via exception
|
||||
ec = make_error_code(errc::argument_out_of_domain);
|
||||
BOOST_TEST_EQ((divide(10, 5, ec)), 2); // no error, report via error_code
|
||||
BOOST_TEST(!ec);
|
||||
|
||||
ec = make_error_code(errc::argument_out_of_domain);
|
||||
BOOST_TEST_EQ((divide(10, 0, ec)), 0); // error, report via error_code
|
||||
BOOST_TEST(ec);
|
||||
|
||||
bool exception_thrown = false;
|
||||
try
|
||||
{ divide(10, 0); } // error, report via exception
|
||||
catch (...)
|
||||
{ exception_thrown = true; }
|
||||
BOOST_TEST(exception_thrown);
|
||||
|
||||
//error_code should_fail(boost::throws()); // should fail at runtime
|
||||
//boost::throws() = ec; // should fail at runtime
|
||||
}
|
||||
}
|
||||
|
||||
// main ------------------------------------------------------------------------------//
|
||||
@@ -202,6 +246,8 @@ int main( int, char ** )
|
||||
BOOST_TEST( econd.message() != "" );
|
||||
BOOST_TEST( econd.message().substr( 0, 13) != "Unknown error" );
|
||||
|
||||
test_throws_usage();
|
||||
|
||||
#ifdef BOOST_WINDOWS_API
|
||||
std::cout << "Windows tests...\n";
|
||||
// these tests probe the Windows errc decoder
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
|
||||
// Motivation was a Boost posting by Christopher Kohlhoff on June 28, 2006.
|
||||
|
||||
#define BOOST_SYSTEM_NO_DEPRECATED
|
||||
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/cerrno.hpp>
|
||||
#include <string>
|
||||
|
||||
@@ -18,7 +18,7 @@ struct foo
|
||||
foo()
|
||||
{
|
||||
boost::system::error_code ec;
|
||||
ec == boost::system::posix::permission_denied;
|
||||
ec == boost::system::errc::permission_denied;
|
||||
}
|
||||
} f;
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
// Copyright 2017 Peter Dimov.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
//
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
// See library home page at http://www.boost.org/libs/system
|
||||
|
||||
#include <boost/system/error_code.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <cerrno>
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::system::error_category const & bt = boost::system::generic_category();
|
||||
|
||||
int ev = ENOENT;
|
||||
|
||||
boost::system::error_code bc( ev, bt );
|
||||
|
||||
BOOST_TEST_EQ( bc.value(), ev );
|
||||
BOOST_TEST_EQ( &bc.category(), &bt );
|
||||
|
||||
boost::system::error_condition bn = bt.default_error_condition( ev );
|
||||
|
||||
BOOST_TEST_EQ( bn.value(), ev );
|
||||
BOOST_TEST_EQ( &bn.category(), &bt );
|
||||
|
||||
BOOST_TEST( bt.equivalent( ev, bn ) );
|
||||
|
||||
BOOST_TEST_EQ( bc, bn );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -9,9 +9,6 @@
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
// test without deprecated features
|
||||
#define BOOST_SYSTEM_NO_DEPRECATED
|
||||
|
||||
#include <boost/config/warning_disable.hpp>
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
Reference in New Issue
Block a user