Re: Throwable::addSuppressed()
| From: | Stephen Coakley | Date: | Fri, 31 Jul 2015 19:44:25 +0000 |
| Subject: | Re: Throwable::addSuppressed() | ||
| References: | 1 | Groups: | php.internals php.internals |
| Request: | Send a blank email to internals+get-87451@lists.php.net to get a copy of this message | ||
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) {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(); 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-
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