/

Node.js中的錯誤處理

Node.js中的錯誤處理

如何在Node.js應用程式執行期間處理錯誤

Node.js中的錯誤通過異常處理。

建立異常

使用throw關鍵字來建立異常:

1
throw value

JavaScript執行此行時,正常程式流程將中斷,控制權會返回到最近的異常處理器

通常在用戶端程式碼中,value可以是任何JavaScript值,包括字串、數字或對象。

在Node.js中,我們不會拋出字串,而是拋出錯誤對象。

錯誤對象

錯誤對象是Error對象的實例,或是擴展了Error類別的對象,這些類別提供在錯誤核心模組中。

1
throw new Error('Ran out of coffee')

或者

1
2
3
4
class NotEnoughCoffeeError extends Error {
//...
}
throw new NotEnoughCoffeeError

處理異常

異常處理器是一個try/catch語句。

try區塊中的代碼行引發的任何異常都在相應的catch區塊中進行處理:

1
2
3
4
5
try {
//代碼行
} catch (e) {

}

此示例中的e是異常值。

您可以添加多個處理器,可以捕獲不同類型的錯誤。

捕獲未捕獲的異常

如果在執行程序期間拋出未捕獲的異常,程序將崩潰。

為了解決這個問題,你可以聽取process對象上的uncaughtException事件:

1
2
3
4
process.on('uncaughtException', (err) => {
console.error('There was an uncaught error', err)
process.exit(1) //根據Node文檔,這是必需的
})

您無需匯入process核心模組,因為它會自動注入。

使用承諾處理異常

使用承諾,您可以鏈接不同的操作,並在結尾處理錯誤:

1
2
3
4
doSomething1()
.then(doSomething2())
.then(doSomething3())
.catch(err => console.error(err))

您如何知道錯誤發生在哪裡?實際上,您並不知道,但您可以在調用的每個函數(doSomethingX)中處理錯誤,在錯誤處理器內部拋出一個新錯誤,將調用外部的catch處理器:

1
2
3
4
5
6
7
8
9
10
const doSomething1 = () => {
//...
try {
//...
} catch (err) {
//... 在本地處理
throw new Error(err.message)
}
//...
}

為了能夠在函數內部處理錯誤而不必在呼叫的函數中處理它們,您可以在每個then()中創建一個函數,並處理異常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
doSomething1
.then((() => {
return doSomething2().catch(err => {
//處理錯誤
throw err //中斷鏈條!
})
})
.then((() => {
return doSomething2().catch(err => {
//處理錯誤
throw err //中斷鏈條!
})
})
.catch(err => console.error(err))

使用async/await處理錯誤

使用async/await,您仍然需要捕獲錯誤,並且可以這樣做:

1
2
3
4
5
6
7
8
async function someFunction() {
try {
await someOtherFunction()
}
catch (err) {
console.error(err.message)
}
}

tags: [“error handling”, “Node.js”, “exceptions”]