HTTPException
致命的なエラーが発生すると、Hono(およびエコシステム内の多くのミドルウェア)は HTTPException をスローすることがあります。これは Hono 独自の Error で、エラーレスポンスの返却を簡単にします。
HTTPException のスロー
ステータスコードと、メッセージまたは独自のレスポンスを指定して、HTTPException をスローできます。
独自のメッセージ
基本的な text レスポンスでは、エラーの message を設定するだけです。
ts
import { HTTPException } from 'hono/http-exception'
throw new HTTPException(401, { message: 'Unauthorized' })独自のレスポンス
ほかのレスポンスタイプを使う場合や、レスポンスヘッダーを設定する場合は、res オプションを使用します。レスポンスの作成には、コンストラクターに渡したステータスコードが使用される点に注意してください。
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 オプションを使って HTTPException に任意のデータを追加できます。
ts
app.post('/login', async (c) => {
try {
await authorize(c)
} catch (cause) {
throw new HTTPException(401, { message, cause })
}
return c.redirect('/')
})HTTPException の処理
捕捉されなかった HTTPException は、app.onError で処理できます。HTTPException には getResponse メソッドがあり、エラーの status と、エラーの message またはスロー時に設定した独自のレスポンスから、新しい Response を作成して返します。
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)
})注意
HTTPException.getResponse は Context を参照しません。Context に設定済みのヘッダーを含めるには、それらを新しい Response に適用する必要があります。