<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>Exceptions</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="exception-h.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="facets.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>Exceptions</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-3.html">Diagnostics</A></P>

<PRE><HR>                                  <B><I>Class derived from exception <IMG SRC="images/inherits.gif">  exception</I></B> 
                 <B><I>Class derived from logic_error <IMG SRC="images/inherits.gif"> logic_error <IMG SRC="images/inherits.gif"> exception</I></B> 
   <B><I>Class derived from runtime_error <IMG SRC="images/inherits.gif"> runtime_error <IMG SRC="images/inherits.gif"> exception</I></B><HR></PRE>
<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Description</A></LI>
<LI><A HREF="#sec4">See Also</A></LI>
<LI><A HREF="#sec5">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>The C++ Standard Library exception classes</P>
<A NAME="sec3"><H3>Description</H3></A>
<P>The C++ Standard Library defines a set of classes intended to be thrown as exceptions. Objects of these classes, and classes derived from these classes, are the only exceptions that can be thrown by the Library. In contrast, client code can throw not only objects of the exception classes, but objects of any type, including native types. The description of each exception class in this entry lists the classes and functions that typically throw it, but exceptions may be thrown from other places as well. </P>
<P>The class <B><I><A HREF="exception.html">exception</A></I></B> serves as a base class to all other Standard <B><I>exception</I></B> classes. The Library has three categories of <B><I>exception</I></B> classes: </P>
<UL>
<LI><P CLASS="LIST">classes derived directly from <B><I><A HREF="exception.html">exception</A></I></B> </P></LI>
<LI><P CLASS="LIST">classes derived through <B><I><A HREF="logic-error.html">logic_error</A></I></B></P></LI>
<LI><P CLASS="LIST">classes derived through <B><I><A HREF="runtime-error.html">runtime_error</A></I></B></P></LI>
</UL>
<P>The diagram above shows the public hierarchy for all derived classes. </P>
<P>The classes derived directly from <B><I><A HREF="exception.html">exception</A></I></B> are:</P>
<P><B><I><A HREF="bad-alloc.html">bad_alloc</A></I></B></P>
<P><B><I><A HREF="bad-cast.html">bad_cast</A></I></B></P>
<P><B><I><A HREF="bad-exception.html">bad_exception</A></I></B></P>
<P><B><I><A HREF="bad-typeid.html">bad_typeid</A></I></B></P>
<P><B><I><A HREF="ios-base.html#failure">ios_base::failure</A></I></B></P>
<P><B><I><A HREF="logic-error.html">logic_error</A></I></B></P>
<P><B><I><A HREF="runtime-error.html">runtime_error</A></I></B></P>
<P>The classes derived from <B><I><A HREF="logic-error.html">logic_error</A></I></B> are:</P>
<P><B><I><A HREF="domain-error.html">domain_error</A></I></B></P>
<P><B><I><A HREF="invalid-argument.html">invalid_argument</A></I></B></P>
<P><B><I><A HREF="length-error.html">length_error</A></I></B></P>
<P><B><I><A HREF="out-of-range.html">out_of_range</A></I></B></P>
<P>The classes derived from <B><I><A HREF="runtime-error.html">runtime_error</A></I></B> are:</P>
<P><B><I><A HREF="overflow-error.html">overflow_error</A></I></B></P>
<P><B><I><A HREF="underflow-error.html">underflow_error</A></I></B></P>
<P><B><I><A HREF="range-error.html">range_error</A></I></B></P>
<P>A <B><I><A HREF="logic-error.html">logic_error</A></I></B> is thrown when the condition causing the error could have been detected by the client before calling the failing code. A <B><I><A HREF="runtime-error.html">runtime_error</A></I></B> is thrown when the error results from a condition that the client could not have tested before calling the failing code.</P>
<P>The class <B><I><A HREF="exception.html">exception</A></I></B> is declared in the header <SAMP>&lt;exception&gt;</SAMP>. Exception classes derived from <B><I><A HREF="logic-error.html">logic_error</A></I></B> and <B><I><A HREF="runtime-error.html">runtime_error</A></I></B> are defined in the <SAMP>&lt;stdexcept&gt;</SAMP> header. The remaining <B><I>exception</I></B> classes are defined in various other headers.   </P>
<A NAME="sec4"><H3>See Also</H3></A>
<P><B><I><A HREF="bad-alloc.html">bad_alloc</A></I></B>, <B><I><A HREF="bad-cast.html">bad_cast</A></I></B>, <B><I><A HREF="bad-exception.html">bad_exception</A></I></B>, <B><I><A HREF="bad-typeid.html">bad_typeid</A></I></B>, <B><I><A HREF="domain-error.html">domain_error</A></I></B>, <B><I><A HREF="exception.html">exception</A></I></B>, <B><I><A HREF="invalid-argument.html">invalid_argument</A></I></B>, <B><I><A HREF="ios-base.html#failure">ios_base::failure</A></I></B>, <B><I><A HREF="length-error.html">length_error</A></I></B>, <B><I><A HREF="logic-error.html">logic_error</A></I></B>, <B><I><A HREF="out-of-range.html">out_of_range</A></I></B>, <B><I><A HREF="overflow-error.html">overflow_error</A></I></B>, <B><I><A HREF="range-error.html">range_error</A></I></B>, <B><I><A HREF="runtime-error.html">runtime_error</A></I></B>, <B><I><A HREF="underflow-error.html">underflow_error</A></I></B></P>
<A NAME="sec5"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems --Programming Language C++, Section 19.1</I></P>

<BR>
<HR>
<A HREF="exception-h.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="facets.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
