Aller au contenu

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.

ts
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.

ts
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.

ts
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.

ts
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.

Publié sous licence MIT.