On 07/28/2015 04:51 PM, Markus Malkusch wrote:
Hi PHP

So I read that there's this Throwable interface coming. Great! How about
extending it with one further method:

void Throwable::addSuppressed(Throwable exception)

Semantic is the same as Java's Throwable.addSuppressed()ยน.

Why? Well consider a code fragment which wants to close a resource
during an exception:

} catch (Exception $e1) {
     try {
         $resource->close();
         throw $e1;

     } catch (ResourceException $e2) {
         // The information about $e2 is lost.
         throw $e1;
     }
}

Currently PHP has no method to propagate both $e1 and $e2. With
Throwable::addSuppressed() $e2 could be added as a suppressed exception
to $e1:

} catch (Exception $e1) {
     try {
         $resource->close();

     } catch (ResourceException $e2) {
         e1->addSuppressed($e2);

     }
     throw $e1;
}

To make this information useful (for e.g. a logger) there's one further
method needed:

Throwable[] Throwable::getSuppressed()

So PHP, what do you think, might a RFC find acceptance?

Best wishes
Markus Malkusch

[1]:
http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html#addSuppressed-java.lang.Throwable-


Interesting thought, but how is this different than including a previous throwable and throwing a new, more descriptive exception?

} catch (Exception $e1) {
     try {
         $resource->close();
     } catch (ResourceException $e2) {
         // Pass in $e2 as the previous exception in the chain.
throw new ResourceFailedException($e1->getMessage(), $e1->getCode(), $e2);
     }
}

What you're describing doesn't seem like a common use case.

Also, this is pretty nitpicky, but the above code might fit better with a finally block when closing resources:

try {
    // Do something with $resource here...
} finally {
     $resource->close();
}

-- Stephen Coakley

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

Reply via email to