public static function exception(callable $function, $class, $message = NULL, $code = NULL)
{
self::$counter++;
$e = NULL;
try {
call_user_func($function);
} catch (\Throwable $e) {
} catch (\Exception $e) {
}
if ($e === NULL) {
self::fail("{$class} was expected, but none was thrown");
} elseif (!$e instanceof $class) {
self::fail("{$class} was expected but got " . get_class($e) . ($e->getMessage() ? " ({$e->getMessage()})" : ''));
} elseif ($message && !self::isMatching($message, $e->getMessage())) {
self::fail("{$class} with a message matching %2 was expected but got %1", $e->getMessage(), $message);
} elseif ($code !== NULL && $e->getCode() !== $code) {
self::fail("{$class} with a code %2 was expected but got %1", $e->getCode(), $code);
}
return $e;
}