Skip to main content
Version: Next 🚧


Exceptions are used to handle errors and exceptions in the application.

To generate new exceptions you may use the apiato:generate:exception interactive command:

php artisan apiato:generate:exception

Definition & Principles

Read Porto SAP Documentation (#Exceptions).


  • All container-specific Exceptions MUST be placed in the app/Containers/{Section}/{Container}/Exceptions directory.
  • All general Exceptions MUST be placed in the app/Ship/Exceptions directory.
  • All Exceptions MUST extend the App\Ship\Parents\Exceptions\Exception class.
    • The parent extension SHOULD be aliased as ParentException.
  • Every Exception MUST have at least two properties: code and message.

Folder Structure

├── Containers
│ └── Section
│ └── Container
│ └── Exceptions
│ ├── SpecificException.php
│ ├── AnotherSpecificException.php
│ └── ...
└── Ship
└── Exceptions
├── GeneralException.php
├── AnotherGeneralException.php
└── ...

Code Example

You can override those values while throwing the error.

use App\Ship\Parents\Exceptions\Exception as ParentException;

class DemoException extends ParentException
protected $code = Response::HTTP_CONFLICT;
protected $message = 'This is a demo exception.';

Helpers Methods


// Example 1
throw (new AccountFailedException())->withErrors(['email' => 'The email has already been taken.']);
// Example 2
throw (new AccountFailedException())->withErrors(['email' => ['The email has already been taken.', 'Another message']]);

You can also use translation strings. Translation strings are automatically translated if the translations are found. To handle localization, you can use the Localization Container.

// Example 1
throw (new AccountFailedException())->withErrors(['email' => '']);
// Example 2
throw (new AccountFailedException())->withErrors(['email' => '', 'Another not translated message']);


"message": "The exception error message.",
"errors": {
"email": [
"The email has already been taken.",
"Another not translated message"


The debug method is used for logging error messages during debugging and development. The debug method accepts string or \Exception instance

throw (new AccountFailedException())->debug($e);