This depends on the exceptions you want to catch.
Example for 5xx HTTP exceptions:
namespace Drupal\mymodule\EventSubscriber;
use Drupal\Core\EventSubscriber\DefaultExceptionHtmlSubscriber;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/**
* Exception subscriber for handling 5xx exceptions
*/
class MymoduleExceptionSubscriber extends DefaultExceptionHtmlSubscriber {
protected static function getPriority() {
return -129;
}
protected function getHandledFormats() {
return ['html'];
}
/**
* Handles a 5xx error for HTML.
*
* @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
* The event to process.
*/
public function on5xx(ExceptionEvent $event) {
if (($exception = $event->getThrowable()) && $exception instanceof HttpExceptionInterface) {
$this->makeSubrequest($event, '/my5xxcontroller', $exception->getStatusCode());
}
}
}
Example for all exceptions (only for demonstration purpose, better check for the exceptions you want to catch):
namespace Drupal\mymodule\EventSubscriber;
use Drupal\Core\EventSubscriber\DefaultExceptionHtmlSubscriber;
use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/**
* Exception subscriber for handling all exceptions
*/
class MymoduleExceptionSubscriber extends DefaultExceptionHtmlSubscriber {
protected static function getPriority() {
return -129;
}
protected function getHandledFormats() {
return ['html'];
}
/**
* Handles all exceptions for HTML
*
* @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
* The event to process.
*/
public function onException(ExceptionEvent $event) {
$request = $event->getRequest();
$handled_formats = $this->getHandledFormats();
$format = $request->query->get(MainContentViewSubscriber::WRAPPER_FORMAT, $request->getRequestFormat());
if (empty($handled_formats) || in_array($format, $handled_formats)) {
$this->makeSubrequest($event, '/my5xxcontroller', 500);
}
}
}
mymodule.services.yml
services:
mymodule.5xx_subscriber:
class: Drupal\mymodule\EventSubscriber\MymoduleExceptionSubscriber
tags:
- { name: event_subscriber }
arguments: ['@http_kernel', '@logger.channel.php', '@redirect.destination', '@router.no_access_checks']