error-handling
Nuxt 3 錯誤處理 (Error handling)
Nuxt 3 是一個全端的框架 (Full-stack Framework),除了在客戶端 Vue 渲染生命週期中的錯誤外,也包含了伺服器端的 SSR 過程、Server API 或是 Nitro Engine 運作過程中的錯誤,大致可以區分為下列三種:
- Vue 渲染生命週期中的錯誤 (SSR + SPA)
- 伺服器端 (Server) 和客戶端 (Client) 啟動時發生的錯誤 (SSR + SPA)
- API 或 Nitro Engine 伺服器端生命週期中的錯誤
Vue 渲染生命週期中的錯誤 (SSR + SPA)
onErrorCaptured
當我們啟用 SSR 時,也就是包含了在後端由 Vue 渲染生命週期中,發生的錯誤,可以使用 Vue.js 提供的 onErrorCaptured() 函數來註冊一個 hook,用以捕獲子元件所發生的錯誤。
舉例,新增一個 ButtonOOPS 元件,並添加一個點擊事件程式碼如下:
const onClick = () => {
throw new Error("由 ButtonOOPS 元件,拋出一個錯誤!");
};
使用 ButtonOOPS 按鈕元件,使用 onErrorCaptured() 來捕獲程式碼如下:
<!-- ./pages/vue/onErrorCaptured.vue -->
<template>
<div class="flex flex-col items-center bg-white py-24">
<ButtonOOPS />
<div class="mt-4 text-red-500">{{ errorMessage }}</div>
</div>
</template>
<script setup>
import { onErrorCaptured } from "vue";
const errorMessage = ref();
onErrorCaptured((err) => {
console.error("[捕獲錯誤]", err.message);
errorMessage.value = err.message;
return false; // 為了不要把 error 冒泡到上層
});
</script>
我們可以在 SFC 中使用 onErrorCaptured() 來捕獲子元件所發生的錯誤,當我們處理完錯誤可以使用 return false 來阻止錯誤冒泡 (Bubbling)。

vueApp.config.errorHandler
Nuxt 提供了一個 vue:error 的 hook,如果 Vue 中發生的錯誤冒泡傳播到頂層,就會呼叫這個 hook,若有使用錯誤處理或回報的框架,我們可以自訂一個插件來接收 Vue 所有的錯誤。這個算是個 global 的 error catch
// ./plugins/vueErrorHandle.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.config.errorHandler = (error) => {
console.error("[由 vueErrorHandle 插件捕獲的錯誤]", error);
};
});
建立一個頁面 ./pages/vue/thowError.vue 來使用 ButtonOOPS 按鈕元件程式碼如下,但不捕獲錯誤,將錯誤繼續冒泡:
<template>
<div class="flex flex-col items-center bg-white py-24">
<ButtonOOPS />
</div>
</template>
元件中所發生的錯誤,不論是否有被處理,只要錯誤冒泡至頂層,就會被 vueErrorHandle 插件所定義的 vue:error 的 hook 所捕獲。
