HTTPException
En cas d’erreur fatale, Hono et de nombreux middlewares de son écosystème peuvent lever une HTTPException. Il s’agit d’une Error propre à Hono qui facilite le renvoi de réponses d’erreur.
Lever des HTTPExceptions
Vous pouvez lever vos propres HTTPExceptions en précisant un code d’état et soit un message, soit une réponse personnalisée.
Message personnalisé
Pour les réponses text simples, il suffit de définir la propriété message de l’erreur.
import { HTTPException } from 'hono/http-exception'
throw new HTTPException(401, { message: 'Unauthorized' })Réponse personnalisée
Pour les autres types de réponses ou pour définir des en-têtes de réponse, utilisez l’option res. Notez que la réponse est construite avec le code d’état passé au constructeur.
import { HTTPException } from 'hono/http-exception'
const errorResponse = new Response('Unauthorized', {
status: 401, // this gets ignored
headers: {
Authenticate: 'error="invalid_token"',
},
})
throw new HTTPException(401, { res: errorResponse })Cause
Dans les deux cas, vous pouvez joindre des données arbitraires à l’HTTPException avec l’option cause.
app.post('/login', async (c) => {
try {
await authorize(c)
} catch (cause) {
throw new HTTPException(401, { message, cause })
}
return c.redirect('/')
})Traiter les HTTPExceptions
Vous pouvez traiter les HTTPExceptions non interceptées avec app.onError. Leur méthode getResponse crée et renvoie une nouvelle Response à partir du status de l’erreur et soit de la propriété message de l’erreur, soit de la réponse personnalisée définie lors de sa levée.
import { HTTPException } from 'hono/http-exception'
// ...
app.onError((err, c) => {
if (err instanceof HTTPException) {
// Return the error response generated by HTTPException
return err.getResponse()
}
// For any other unexpected errors, log and return a generic 500 response
console.error(err)
return c.text('Internal Server Error', 500)
})Attention
HTTPException.getResponse ne tient pas compte du Context. Pour inclure les en-têtes déjà définis dans le Context, vous devez les ajouter à une nouvelle Response.