tags:

views:

167

answers:

3

Context

I came across some code, like this:

if( Some_Condition ) throw 0;

I googled a bit, and found a few other code snippets using that odd looking throw 0 form.

I presume one would catch this as:

catch(const int& e) 
{  }

Or is this a NULL ptr? to be caught as void* ?

Question

What does this throw 0 do? Is it special in some way?

My normal preference would be to throw something that is (or derived from) std::exception. So to me this looks "bad". Is it "bad" ?

+3  A: 

It is not special, you can thow int just as an exception class.

It is considered a poor style, because an exception class can tell more about what actually happened.

Pavel Radzivilovsky
+11  A: 

Generally throw can throw any type, any you need to catch it with this type or its base type.

So technically it is legal code but...

it is bad code: You should always derive your exceptions from std::exception or at least from some class that provides some useful information about error rather then plain number. But deriving from std::exception is the correct way because it allows to use topmost catch(std::exception const &e) and get at least some information about the error.

Artyom
+1  A: 

It's an int. It is "bad", since throwing 0 makes the code unreadable, or hints someone is using exceptions as a value returning system. (It's basically the same problem as a magic number inside the code)

NULL is defined as ((void *)0). If the compiler sees a 0 it means an int. It may be automatically casted to something else, but only if there's a reason (For example assignment to double). The line throw 0 does not give such a reason, so an int is thrown.

Shiroko
`((void*)0)` is not a valid definition for NULL in C++.
Roger Pate
Could you catch `0` with `catch (void* ex)` or similar?
OregonGhost
MSalters