Throwable, Exception, and Error

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun May 3 14:07:38 PDT 2009


Jarrett Billingsley wrote:
> On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2korden at gmail.com> wrote:
>> PHP allows function definition like this:
>>
>> void foo(Args args, string fileName = __FILE__, int line = __LINE__)
>> {
>>  // do stuff
>> }
> 
> Hidden feature: D2 allows it too, at least with templates.
> 
> void Throw(T : Throwable, string file = __FILE__, int line = __LINE__)(T ex)
> {
> 	ex.file = file;
> 	ex.line = line;
> 	throw ex;
> }
> 
> void foobar()
> {
> 	Throw(new Exception("o hai"));
> }
> 
> void main()
> {
> 	try
> 		foobar();
> 	catch(RangeError e)
> 		writefln("(%s: %d) %s", e.file, e.line, e.msg);
> }
> 
> I did find a sort of bug when trying a slightly different
> implementation of this though - any kind of explicit instantiation of
> the Throw template causes the __FILE__ and __LINE__ to be evaluated in
> the scope of the template rather than at the call site.

That's intentional and is used in enforce() and a couple other places in 
Phobos.

Andrei



More information about the Digitalmars-d mailing list