> True, but if you instead of throwing the same exception, threw a new one, you 
> could capture both stacks. But you can never get the stack from the throw 
> point of something created elsewhere.

Precisely.

I think there are good reasons why other languages collect the
stack-trace on throw.

Collecting the stack trace at construction would be correct if "throw
new" was literally one statement - if the only time you could throw
was at creation.

That's not the case. We have deferred throws and factory methods for
exceptions, and we have re-throws, so collecting the stack-trace at
construction time doesn't work.

Of course, fixing this would require a BC break, and nobody wants to
even entertain the thought of those :-(

On Thu, May 19, 2016 at 10:30 PM, Ryan Pallas <derokor...@gmail.com> wrote:
> On Thu, May 19, 2016 at 1:47 PM, Rowan Collins <rowan.coll...@gmail.com>
> wrote:
>
>> On 19/05/2016 19:35, Rasmus Schultz wrote:
>>
>>> Technically, every throw is a new exception "flow" - even if you're >
>>> recycling the Exception instance, it's the throw statement that >
>>>
>> starts the unique stack unwind from the throw site; it's where the >
>> action happens.
>>
>> That's one interpretation, but it doesn't really hold up in all cases.
>> Consider a catch statement that needs to filter more granularly than the
>> class name; since you already mentioned PDO, I'll make an example with that:
>>
>> catch ( PDOException $e ) {
>>     if ( substr($e->getCode(), 0, 2) === '08' ) {
>>         $this->reconnect();
>>     } else {
>>         throw $e;
>>     }
>> }
>>
>> Of what value to a subsequent catch statement is the trace of that throw
>> statement? And why does that "start a new exception flow", but if PDO threw
>> different sub-classes, you could let one flow through unmodified by
>> tightening the catch statement?
>>
>
> True, but if you instead of throwing the same exception, threw a new one,
> you could capture both stacks. But you can never get the stack from the
> throw point of something created elsewhere.
>
> catch ( PDOException $e ) {
>     if ( substr($e->getCode(), 0, 2) === '08' ) {
>         $this->reconnect();
>     } else {
>         throw new PDOException($e->getMessage(), $e->getCode(), $e);
>     }
> }
>
>
>
>> Regards,
>> --
>> Rowan Collins
>> [IMSoP]
>>
>>
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>>

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to