digitalmars.D - Throwable, Exception, and Error
- Steve Teale (3/3) May 01 2009 If I want a catch-all catch, which should I be using.
- Walter Bright (2/8) May 02 2009 Yes.
- Frank Benoit (4/14) May 02 2009 Why is it possible to throw an Object?
- Denis Koroskin (2/16) May 03 2009 This is going to be addressed, so no worries.
- Christopher Wright (4/18) May 03 2009 Because Phobos did not contain Throwable until the advent of druntime.
- Steve Teale (2/21) May 03 2009 When that is done, and the object being thrown has been checked out, wou...
- Christopher Wright (5/26) May 03 2009 Hrm. You want to assign the file and line numbers where the exception is...
- Steve Teale (4/32) May 03 2009 OK, I did not think it through, but it would save a lot of typing grief;
- Denis Koroskin (19/55) May 03 2009 PHP allows function definition like this:
- Jarrett Billingsley (24/29) May 03 2009 Hidden feature: D2 allows it too, at least with templates.
- Andrei Alexandrescu (4/38) May 03 2009 That's intentional and is used in enforce() and a couple other places in...
- Jarrett Billingsley (9/15) May 03 2009 That's what I figured. It wasn't until I looked at the source to
- Jarrett Billingsley (3/4) May 03 2009 eh that's supposed to be Exception
- Steve Teale (4/38) May 03 2009 Sadly this is a subterfuge that makes it impossible as far as I can see ...
If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?
May 01 2009
Steve Teale wrote:If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 02 2009
Walter Bright schrieb:Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 02 2009
On Sun, 03 May 2009 09:57:02 +0400, Frank Benoit <keinfarbton googlemail.com> wrote:Walter Bright schrieb:This is going to be addressed, so no worries.Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 03 2009
Frank Benoit wrote:Walter Bright schrieb:Because Phobos did not contain Throwable until the advent of druntime. This was sufficiently recent that Walter has not yet modified the compiler accordingly, or, most likely, noticed or decided to do so.Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 03 2009
Christopher Wright Wrote:Frank Benoit wrote:When that is done, and the object being thrown has been checked out, would it be a good idea for the compiler to automatically populate the file and line members of the Throwable?Walter Bright schrieb:Because Phobos did not contain Throwable until the advent of druntime. This was sufficiently recent that Walter has not yet modified the compiler accordingly, or, most likely, noticed or decided to do so.Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 03 2009
Steve Teale wrote:Christopher Wright Wrote:Hrm. You want to assign the file and line numbers where the exception is thrown, but not if you are rethrowing the exception. The runtime has something like _d_throw; if the signature included __FILE__ and __LINE__ for the throw expression, that should work.Frank Benoit wrote:When that is done, and the object being thrown has been checked out, would it be a good idea for the compiler to automatically populate the file and line members of the Throwable?Walter Bright schrieb:Because Phobos did not contain Throwable until the advent of druntime. This was sufficiently recent that Walter has not yet modified the compiler accordingly, or, most likely, noticed or decided to do so.Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 03 2009
Christopher Wright Wrote:Steve Teale wrote:OK, I did not think it through, but it would save a lot of typing grief; ... , __FILE__, __LINE__); every time you wanted to be careful.Christopher Wright Wrote:Hrm. You want to assign the file and line numbers where the exception is thrown, but not if you are rethrowing the exception. The runtime has something like _d_throw; if the signature included __FILE__ and __LINE__ for the throw expression, that should work.Frank Benoit wrote:When that is done, and the object being thrown has been checked out, would it be a good idea for the compiler to automatically populate the file and line members of the Throwable?Walter Bright schrieb:Because Phobos did not contain Throwable until the advent of druntime. This was sufficiently recent that Walter has not yet modified the compiler accordingly, or, most likely, noticed or decided to do so.Steve Teale wrote:Why is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will miss some things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.
May 03 2009
On Sun, 03 May 2009 22:12:00 +0400, Steve Teale <steve.teale britseyeview.com> wrote:Christopher Wright Wrote:PHP allows function definition like this: void foo(Args args, string fileName = __FILE__, int line = __LINE__) { // do stuff } You call it like this: "foo(args);" and correct file name and line number is passed, i.e. default arguments are evaluated at call site. Can we use the same trick for exceptions? Here is an example: class Throwable { this(string fileName = __FILE__, int line = __LINE__) { ... } } class Exception : Throwable { this(string reason, string fileName = __FILE__, int line = __LINE__) { super(fileName, line); // ... } }Steve Teale wrote:OK, I did not think it through, but it would save a lot of typing grief; ... , __FILE__, __LINE__); every time you wanted to be careful.Christopher Wright Wrote:someFrank Benoit wrote:Walter Bright schrieb:Steve Teale wrote:If I want a catch-all catch, which should I be using. Out of habit I use Exception, but if I do that then I will missdruntime.Because Phobos did not contain Throwable until the advent ofWhy is it possible to throw an Object? I think "throw" and "catch" should be restricted to Throwable and derived types.things thrown from Phobos. Is it the intention that Throwable be used for this purpose?Yes.would it be a good idea for the compiler to automatically populate the file and line members of the Throwable? Hrm. You want to assign the file and line numbers where the exception is thrown, but not if you are rethrowing the exception. The runtime has something like _d_throw; if the signature included __FILE__ and __LINE__ for the throw expression, that should work.This was sufficiently recent that Walter has not yet modified the compiler accordingly, or, most likely, noticed or decided to do so.When that is done, and the object being thrown has been checked out,
May 03 2009
On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2korden gmail.com> wrote:PHP allows function definition like this: void foo(Args args, string fileName =3D __FILE__, int line =3D __LINE__) { =A0// do stuff }Hidden feature: D2 allows it too, at least with templates. void Throw(T : Throwable, string file =3D __FILE__, int line =3D __LINE__)(= T ex) { ex.file =3D file; ex.line =3D 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.
May 03 2009
Jarrett Billingsley wrote:On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2korden gmail.com> wrote:That's intentional and is used in enforce() and a couple other places in Phobos. AndreiPHP 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.
May 03 2009
On Sun, May 3, 2009 at 5:07 PM, Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> wrote:That's what I figured. It wasn't until I looked at the source to std.contracts that I found out about it, though, and I doubt many other people know about it. The only mention about it in the changelog is for 2.013, where it says "Changed __FILE__ and __LINE__ so they work as parameter default initializers" but that doesn't.. well, doesn't say a lot :P In any case, I doubt the bug is intentional.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.
May 03 2009
On Sun, May 3, 2009 at 4:36 PM, Jarrett Billingsley <jarrett.billingsley gmail.com> wrote:=A0 =A0 =A0 =A0catch(RangeError e)eh that's supposed to be Exception
May 03 2009
Jarrett Billingsley Wrote:On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2korden gmail.com> wrote:Sadly this is a subterfuge that makes it impossible as far as I can see to write code that compiles and works the same with both D1 and D2. D1 compiles it, but reports the exception at the line where the template function is defined. ;=(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.
May 03 2009