Skip to content

useErrorHandler

Điểm hiển thị lỗi tập trung: phân loại AppError rồi chọn cách báo — message, notification, hoặc im lặng để form tự hiện.

Trong app sản phẩm, gần như không gọi trực tiếp: layer đã tạo sẵn một handler ở plugin 04.error và cung cấp qua $tascoError. Trang chỉ cần:

ts
const { $tascoError } = useNuxtApp()

try {
  await removeOrder(id)
} catch (caught) {
  $tascoError(caught)
}

Trang này mô tả chính cái handler đó — hữu ích khi cần hiểu quy tắc hiển thị hoặc khi tự dựng handler riêng ngoài Nuxt (ví dụ trong Storybook hoặc một app không dùng layer).

Quy tắc hiển thị

LỗiHiển thịHook
401messageonAuthError — layer điều hướng về trang đăng nhập
403messageonForbidden
422Không hiện gì— form tự gắn lỗi vào từng ô
5xxnotification "Lỗi hệ thống"
Không có mã (mất mạng, timeout)notification
Còn lạimessage

Thông báo giống hệt nhau trong vòng 3 giây chỉ hiện một lần, nên nhiều request cùng hỏng không phủ kín màn hình. Đổi cửa sổ này bằng dedupeMs.

Tự tạo handler

ts
import { useErrorHandler } from '@tasco/ui'

const { handleError } = useErrorHandler({
  onAuthError: () => navigateTo('/auth/login'),
  onForbidden: () => navigateTo('/403'),
  dedupeMs: 5000,
})

handleError trả về AppError đã chuẩn hoá nên dùng tiếp được:

ts
const error = handleError(caught, { silent: true })
if (error.status === 409) await reloadAndRetry()
Tuỳ chọn của handleErrorTác dụng
silent: trueChỉ phân loại và gọi hook, không hiển thị gì
fallbackMessageDùng khi lỗi không có message

Lưu ý

  • Không tạo nhiều handler trong cùng một app: mỗi handler có bộ nhớ chống lặp riêng, hai handler sẽ hiện hai toast cho cùng một lỗi.
  • 422 cố tình im lặng — đừng "sửa" bằng cách toast thêm, người dùng sẽ thấy lỗi hai nơi.
  • Thông báo lấy từ error.message, tức là chuỗi backend trả về: thống nhất với backend rằng chuỗi đó viết cho người dùng cuối đọc.

Liên quan