Suppressed exceptions are useful for aggregating more exceptions from unreliable resources.
Useful when you want to communicate that process failed, with a list of sibling exceptions that led to an error.
repositories:
- Grifart GitLab
- GitHub (mirror)
$remoteSources = []; // classes representing unreliable remote sources
$exceptions = [];
foreach ($remoteSoures as $remoteSource) {
try {
$remoteSource->fetch(); // unsafe operation
} catch (FetchingFailed $e) {
$exceptions[] = $e;
continue;
}
}
if (count($exceptions) > 0) {
$e = new ProcessingFailed();
$e->addSuppressed(...$exceptions);
throw $e;
}
You can also override exception constructor to provide better API
final class EventPropagationFailedException extends \RuntimeException implements \Grifart\SuppressedExceptions\WithSuppressedExceptions
{
use \Grifart\SuppressedExceptions\SuppressedExceptions;
public function __construct(\Throwable ...$suppressed)
{
parent::__construct('Saving succeeded, but some listeners failed to complete their job. Please check suppressed exceptions for more information.');
$this->addSuppressed(...$suppressed);
}
}
Usage is then
throw new EventPropagationFailedException(...$suppressedExceptions);
TODO: screenshot from debugger how it looks when catched