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