By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,574 Members | 2,966 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,574 IT Pros & Developers. It's quick & easy.

How do I use std::out_of_range ?

P: n/a
Hi,

In a function that erases part of a string, the compiler sometimes
gives this error:

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase
I can guess, then, that I'm erasing outside the strings length, but I
can not find the bug:

for(long i=0; i<str.length()-1; i++)
{
if( str[i] == '[' && str[i+1] == ']' )
str.erase(i, 2);
}

Maybe someone can see the problem in this case, but I'm also
interested in generally learning how to use these exceptions.
How do I use 'out_of_range' and 'what' in my source code so I can put
a breakpoint in to the debugger when this error occurs?

Thanks

Steve

Apr 25 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On 2007-04-25 11:34, Steve555 wrote:
Hi,

In a function that erases part of a string, the compiler sometimes
gives this error:

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase
I can guess, then, that I'm erasing outside the strings length, but I
can not find the bug:

for(long i=0; i<str.length()-1; i++)
{
if( str[i] == '[' && str[i+1] == ']' )
str.erase(i, 2);
}

Maybe someone can see the problem in this case, but I'm also
interested in generally learning how to use these exceptions.
How do I use 'out_of_range' and 'what' in my source code so I can put
a breakpoint in to the debugger when this error occurs?
out_of_range is one of the exceptions found in <stdexceptand is a
class derived from std::exception (found in <exception>). To handle
exceptions you put the stuff that might throw in a try-block and then
use catch() to catch the exceptions:

try {
/* Code that can throw */
}
catch (std::out_of_range& e) {
std::cout << "Out of range: " << e.what() << "\n";
}
catch (std::exception& e) {
std::cout << "Some other exception: " << e.what() << "\n";
}

This will first see if it's a out_of_range exception that has been
thrown, and if it is it will be handled as such. If not it will try to
catch it as a std::exception and handle it as such.

Notice though that there's no need for an exception to be derived from
std::exception, anything can be thrown, even ints doubles and such. You
should really read up on them in your book, there's more to know.

BTW, what debugger are you using that does not break on an unhandled
exception?

--
Erik Wikström
Apr 25 '07 #2

P: n/a
On 25 Apr, 18:09, Erik Wikström <Erik-wikst...@telia.comwrote:
On 2007-04-25 11:34, Steve555 wrote:
Hi,
In a function that erases part of a string, the compiler sometimes
gives this error:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase
I can guess, then, that I'm erasing outside the strings length, but I
can not find the bug:
for(long i=0; i<str.length()-1; i++)
{
if( str[i] == '[' && str[i+1] == ']' )
str.erase(i, 2);
}
Maybe someone can see the problem in this case, but I'm also
interested in generally learning how to use these exceptions.
How do I use 'out_of_range' and 'what' in my source code so I can put
a breakpoint in to the debugger when this error occurs?

out_of_range is one of the exceptions found in <stdexceptand is a
class derived from std::exception (found in <exception>). To handle
exceptions you put the stuff that might throw in a try-block and then
use catch() to catch the exceptions:

try {
/* Code that can throw */}

catch (std::out_of_range& e) {
std::cout << "Out of range: " << e.what() << "\n";}

catch (std::exception& e) {
std::cout << "Some other exception: " << e.what() << "\n";

}

This will first see if it's a out_of_range exception that has been
thrown, and if it is it will be handled as such. If not it will try to
catch it as a std::exception and handle it as such.

Notice though that there's no need for an exception to be derived from
std::exception, anything can be thrown, even ints doubles and such. You
should really read up on them in your book, there's more to know.

BTW, what debugger are you using that does not break on an unhandled
exception?

--
Erik Wikström
Thanks Erik, I got that working as needed ( I had to include stdexcept
too).
It is something I need to read up on, but at least it's not a complete
mystery now that I have try&catch working

I'm using Apple's XCode. It does indeed break on exceptions, what I
shopuld have said was that I wanted to put some extra code in thheir
to try and trace this bug that happens so rarely I couldn't , er,
'catch' it.

Steve

Apr 26 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.