Exception Safe Programming
Tyler Knott
tywebmail at mailcity.com
Sat Feb 24 20:29:33 PST 2007
Saaa wrote:
> That is exactly what I originally thought, but why then is that piece of
> code a example of how to ...
> oh wait... if f=dofoo() fails, f is still unchanged and the correct thing to
> do is to exit the function through an exception.
> never mind, but thanks :)
When an exception is thrown and not caught, the compiler unwinds the callstack until it finds a handler. What this
means is that if a function throws an exception then the program will look for the closest call inside a try block with
a following catch block that will accept the type of the exception (or a type the exception is implicitly castable to).
So, for example:
import std.stdio;
class MsgClass
{
this() { writefln("MsgClass constructed."); }
~this() { writefln("MsgClass destructed."); }
}
class TestException : Exception
{
this(char[] msg) { super(msg); }
}
void thrower()
{
writefln("Throwing exception.");
throw new TestException("This is an exception");
}
int inBetween()
{
//Destructs after the exception because its scope is destroyed by the exception
scope MsgClass i = new MsgClass();
thrower();
writefln("Returning 5..."); //Never prints
return 5; //Function never returns
}
void main()
{
int x;
try
{
x = inBetween(); //x is never assigned
}
catch(Exception e)
{
writefln("Caught exception: ", e);
}
writefln("The value of x is: ", x); //x = 0
}
This code will output the following with thrower() called:
MsgClass constructed.
Throwing exception.
MsgClass destructed.
Caught exception: This is an exception
The value of x is: 0
And this without:
MsgClass constructed.
Returning 5...
MsgClass destructed.
The value of x is: 5
More information about the Digitalmars-d-learn
mailing list