Exception dari handler, controller, middleware, atau layanan diteruskan ke exception renderer yang didaftarkan pada bootstrap/app.js.
Exception HTTP
Gunakan HttpException ketika status dan pesan aman untuk dikirim kepada klien.
import { HttpException } from '../framework/Foundation/Exceptions/HttpException.js';
throw new HttpException(404, 'Post tidak ditemukan.');
Argument ketiga dapat membawa detail terstruktur. ValidationException menggunakan mekanisme ini untuk menghasilkan status 422 dan error per field.
Renderer aplikasi
Skeleton bawaan mengubah exception menjadi JSON:
.withExceptions((exceptions) => {
exceptions.render((error, request, response) => response.json({
message: error.status && error.status < 500
? error.message
: (process.env.APP_DEBUG === 'true' ? error.message : 'Server Error'),
...(error.details ? { errors: error.details } : {}),
}, error.status ?? 500));
})
Mode debug
Pastikan APP_DEBUG=false di produksi. Exception internal tanpa status akan dikirim sebagai 500 Server Error, sedangkan pesan detail tetap tersedia selama pengembangan ketika debug aktif.
Logging exception
Renderer dapat mencatat error sebelum mengirim respons. Jangan masukkan kata sandi, token, cookie, atau data pribadi ke context log.
exceptions.render(async (error, request, response) => {
await app.make('log').error(error.message, {
method: request.method,
path: request.path,
});
return response.json({ message: 'Server Error' }, error.status ?? 500);
});