Hono — إطار العمل للويب على معايير الويب › مرجع الواجهة 7 / 8 السابق التالي

`HTTPException`

عند حدوث خطأ فادح (fatal error)، قد يُلقي Hono (والعديد من وسائط النظام البيئي) خطأً HTTPException. هذه برمجية Hono وسيطة مخصصة Error الذي يبسِّط إرجاع استجابات الأخطاء.

رمي HTTPExceptions

يمكنك إلقاء استثناءات HTTP الخاصة بك (HTTPExceptions) عن طريق تحديد رمز حالة، وإما رسالة أو استجابة مخصصة.

رسالة مخصصة

للاستخدام الأساسي text الاستجابات، ما عليك سوى تعيين الخطأ message.

import { HTTPException } from 'hono/http-exception'

throw new HTTPException(401, { message: 'Unauthorized' })

استجابة مخصصة

لأنواع استجابات أخرى، أو لضبط ترويسات الاستجابة (response headers)، استخدم res خيار. لاحظ أن الحالة التي يتم تمريرها إلى المُنشئ (constructor) هي المستخدمة لإنشاء الاستجابات.

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.

import { Hono, Context } from 'hono'
import { HTTPException } from 'hono/http-exception'
const app = new Hono()
declare const message: string
declare const authorize: (c: Context) => Promise<void>
// ---cut---
app.post('/login', async (c) => {
  try {
    await authorize(c)
  } catch (cause) {
    throw new HTTPException(401, { message, cause })
  }
  return c.redirect('/')
})

معالجة HTTPExceptions

يمكنك معالجة HTTPExceptions غير المُلتقَطة باستخدام app.onError. تتضمن getResponse دالة تُعيد Response المُنشأة من الخطأ status، وإما الخطأ message، أو استجابة مخصصة المعيّن عند رفع الخطأ.

import { Hono } from 'hono'
const app = new Hono()
// ---cut---
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.