Re: C++0x/1x exception specifications proposal: Compile-time checked
Ioannis Vranos wrote:
Compiler checks/errors:
Where the source code is available to the compiler, any
_nothrow(some_exception) specification at a function/member function,
must have at least one equivalent catch(some_exception) or catch(...)
exception handler at the function definition.
For example:
void somefunc() _throw()
{
int *p= new int[10];
} _nothrow (std::bad_alloc)
should be flagged as a compiler error, because there is no
catch(std::bad_alloc) or catch(...) exception handler at the function
definition.
The following should be correct:
1 .
void somefunc() try _throw()
{
int *p= new int[10]
} _nothrow (std::bad_alloc)
catch(std::bad_alloc)
{
// ...
}
2.
void somefunc() try _throw()
{
int *p= new int[10]
} _nothrow (std::bad_alloc)
catch(...)
{
// ...
}
3.
void somefunc() try _throw()
{
int *p= new int[10]
} _nothrow (...)
catch(...)
{
// ...
}
Where the source code is available to the compiler, any
_throw(some_exception) specification at a function/member function, must
have at least one equivalent throw some_exception(); statement.
Remember each function/member function is a level, and its _throw
specifications are about exceptions they explicitly throw, and not about
"inherited" exceptions from other function/member function calls.
For example:
void somefunc() _throw(std::bad_alloc)
{
}
is a compiler error.
void somefunc() _throw(std::bad_alloc)
{
throw std::bad_alloc();
}
is correct.
The following should be correct:
void somefunc() _throw()
{
vector<int> vec(10);
for (vector<int>::size_type i= 0; i< 10; ++i)
vec.at(i)=5;
}
because it doesn't throw any exception by itself.
void somefunc() try _throw()
{
vector<int> vec(10);
for (vector<int>::size_type i= 0; i< 10; ++i)
vec.at(i)=5;
} _nothrow (std::out_of_range)
catch(std::out_of_range)
{
// ...
}
is correct and removes std::out_of_range from the exception
"accumulation" list.