Exceptions
Exceptions in your module
The graphql-base module provides the following exceptions you can use or extend from
| Class | Category | Description | 
|---|---|---|
| InvalidLogin | permissionerror | Thrown when we have an invalid login | 
| InvalidToken | permissionerror | Thrown when a token is invalid | 
| NotFound | requesterror | Thrown when a record was not found | 
| Exists | requesterror | Thrown when a record exists (when we want to register already registered customer) | 
| OutOfBounds | requesterror | Thrown when values are out of bounds | 
Exception to GraphQL Error
The GraphQL modules are build using GraphQLite, which requires graphql-php. Here you can see how graphql-php handles errors.
In short: If you want the consumer to see the message of your exception, it needs to implement the GraphQL\Error\ClientAware interface.
Error categories
In the error response you might want to see a category entry, which describes the category of the error. You can use OxidEsales\GraphQL\Base\Exception\ErrorCategories class, which defines several error categories.
Example
Here is an example of a custom exception which tells us that a product was not found. It is part of the graphql-storefront module.
<?php
declare(strict_types=1);
namespace OxidEsales\GraphQL\Storefront\Product\Exception;
use OxidEsales\GraphQL\Base\Exception\NotFound;
use function sprintf;
final class ProductNotFound extends NotFound
{
    public static function byId(string $id): self
    {
        return new self(sprintf('Product was not found by id: %s', $id));
    }
}
Here is an example of an exception when customer’s password does not match the requirements:
<?php
declare(strict_types=1);
namespace MyVendor\MyModule\Record\Exception;
use Exception;
use GraphQL\Error\ClientAware;
use OxidEsales\GraphQL\Base\Exception\ErrorCategories;
final class PasswordMismatchException extends Exception implements ClientAware
{
    public function isClientSafe(): bool
    {
        return true;
    }
    public function getCategory(): string
    {
        return ErrorCategories::REQUESTERROR;
    }
    public static function byOldPassword(): self
    {
        return new self('Old password does not match our records');
    }
    public static function byLength(): self
    {
        return new self('Password does not match length requirements');
    }
}
In this example you can see the usage of ClientAware and ErrorCategories.