On 19-02-2012 16:00, Jose Armando Garcia wrote:
On Sun, Feb 19, 2012 at 12:44 PM, Alex Rønne Petersen
<[email protected]>  wrote:
On 19-02-2012 15:41, Andrei Alexandrescu wrote:

On 2/19/12 7:31 AM, Timon Gehr wrote:

On 02/19/2012 09:26 AM, H. S. Teoh wrote:

On Sat, Feb 18, 2012 at 11:52:00PM -0800, Jonathan M Davis wrote:
[...]

So, while at first glance, it seems like a good idea, I think that it
has too many issues as-is to work. It might be possible to adjust the
idea to make it workable though. Right now, it's possible to do it via
mixins or calling a function inside the catch, but doing something
similar to this would certainly be nice, assuming that we could sort
out the kinks.

[...]

I have an idea. What about "signature constraints" for catch, ala
template signature constraints? Something like this:

try {
...
} catch(IOException e)
if (e.errno in subsetYouWantToHandle)
{
...
}

Just using IOException as an example. The idea is to allow arbitrary
expressions in the constraint so whatever doesn't satisfy the constraint
will be regarded as "not caught", even if the base type matches.


T


Nice.


That helps. This quite nicely illustrates that types don't necessarily
need to proliferate. Something not much more constraining can be done
today:

try {
...
} catch(IOException e)
{
if (e.errno !in subsetYouWantToHandle) throw e;
...
}


Andrei


As I pointed out on the pull request, this is *evil*. It resets the stack
trace.


What? Is there a technical reason why throw resets the stack? Java
doesn't work this way. In java the stack is created when the object
Throwable is created:

"A throwable contains a snapshot of the execution stack of its thread
at the time it was created. It can also contain a message string that
gives more information about the error. Finally, it can contain a
cause: another throwable that caused this throwable to get thrown. The
cause facility is new in release 1.4. It is also known as the chained
exception facility, as the cause can, itself, have a cause, and so on,
leading to a "chain" of exceptions, each caused by another. "

We should consider changing this to work more like Java. This allows
for patterns like:

// Log the stack but don't throw
auto e = new Exception();
writefln(e.stack);

Thanks,
-Jose

--
- Alex

If Java really works that way, I'm sorry, but that just makes me think even worse of the language/VM.

If you create an exception object in some utility function (or chain of such), you don't want those in your stack trace. You want the stack trace to start from where you throw the object, not where you created it. Anything else is just confusing (and perhaps explains the several hundred lines long stack traces Java programs sometimes spit out...).

--
- Alex

Reply via email to