Skip to main content

Error Handling

Introduction

All exceptions thrown by your application will be reported by the Formidable framework. However, you may wish to define your own exception reporting behavior, including logging exceptions or sending exceptions to an external service like Sentry or Bugsnag.

Configuration

The debug option in your config/app.imba or config/app.ts configuration file determines how errors are displayed by your application. By default, this option is set to true, which results in detailed error messages being displayed. In production applications, it's recommended to set this value to false.

The Exception Handler

Logging

By default, the Formidable Framework will log all exceptions excluding HttpException based exceptions to Bugsnag. You can exclude your own exceptions by adding a dontReport getter in the app/Exceptions/Handler.imba or app/Exceptions/Handler.ts file:

app/Exceptions/Handler.ts
import { ExceptionHandler, HttpException } from '@formidablejs/framework'

export class Handler extends ExceptionHandler {
get dontReport() {
return [
HttpException
]
}
}

Handling

You can handle exceptions by adding a handle method in the app/Exceptions/Handler.imba or app/Exceptions/Handler.ts file. Out of the box, you don't need to add a handle method as the framework will handle all exceptions for you. However, if you want to add your own custom exception handling, you can do so by adding a handle method:

app/Exceptions/Handler.ts
import { ExceptionHandler, NotFoundException, view } from '@formidablejs/framework'
import { NotFound } from '../../resources/views/errors/NotFound'

export class Handler extends ExceptionHandler {
handle(exception: Error) {
if (exception instanceof NotFoundException) {
return view(NotFound)
}
}
}

Conditional Handling

If your application handles both web based and api based requests, you can use the request argument to determine the type of request. For example, you can return a JSON response for api requests and a view for web requests:

app/Exceptions/Handler.ts
import { ExceptionHandler, NotFoundException, view, response } from '@formidablejs/framework'
import { NotFound } from '../../resources/views/errors/NotFound'

export class Handler extends ExceptionHandler {
handle(exception: Error, request) {
if (exception instanceof NotFoundException) {
if (request.expectsJson()) {
return response({ message: 'Not Found' }, 404)
} else {
return view(NotFound)
}
}
}
}