throw and try..catch statementsthrow statement to the catch clause
that encloses it or any of the calls on the call stack.
The beauty of this solution is that calls look identical,
and the error processing code is in the function that wants to catch it.
throw somethingthrow statement can throw a value of any type, but if your
exceptional condition fits into one of the standard exceptions,
use it. As a rule, use one of the logic_error exceptions
if the error is a result of a programming logic error, eg, the programmer
should have checked the bounds before referencing an element in a container.
Use one of the runtime_errors if the error is the result
of input that the programmer can not easily check for, eg, input values
that result in ranges being exceeded, too much data, etc.
#include <stdexcept> using namespace std; // Or prefix names with std::to get the following classes defined. These are arranged in a class hierarchy shown by the indentation below.
exception
logic_error
domain_errorinvalid_argumentlength_errorout_of_rangeruntime_error
range_erroroverflow_errorunderflow_errorTo create an exception and throw it, call the constructor with a c-string parameter.
throw out_of_range("Subscript less than zero");
You can catch an exception of a specific type, or any of its subclasses,
by specifying
the class name as the type of the parameter in the catch clause.
Call the what method to get the error string from a standard
exception.
vector<int> v; // using standard vector class
. . .
try {
. . .
x = v.at(-2); // this throws out_of_range exception.
. . .
} catch (out_of_range e) {
cerr << e.what() << endl; // print error
exit(1); // stop program
}
Altho C++ popularized exceptions, they aren't used extensively within the STL or other libraries because exceptions were not available in all implementations for a long time. You can pursue these, but I don't think I'll write notes on them.