在程式流程裡,難免會遇到錯誤情況。若不捕捉錯誤,可能造成程式無法繼續運行。因此今天就來簡單認識一下 try…catch 吧!
➤ try…catch
try…catch 分為 try 區塊與 catch 區塊。
try{
// 欲執行的程式碼
}catch(e){
// 當錯誤發生時,欲執行的程式碼
}
若 try 區塊中的程式碼無任何錯誤,則忽略 catch 區塊中的程式碼;若 try 區塊中的程式碼發生錯誤,則中斷 try 區塊程式碼的執行,並將控制權轉給 catch 區塊的程式碼。
catch 區塊接受一參數,可以利用這個參數取得錯誤資訊。
例如:
function test(){
throw new Error("something wrong")
}try{
test()
console.log("fine")
}catch(e){
console.log(e.message)
}
結果印出 something wrong
。
在 try 區塊中,執行 test function 時,發生錯誤,錯誤被 throw 丟出,try 區塊執行中斷,將控制權轉給 catch ,因此 console.log("fine")
沒有執行,錯誤由 catch 接住作為參數,並可於 catch 區塊中,進行錯誤處理。
try…catch 僅能抓取同步錯誤
如果 try 當中的語句,含有異步程式,且異步程式發生錯誤,則 try 區塊無法捕捉錯誤,因 try 區塊的程式碼已經執行完畢,異步程式碼是發生於 try 區塊之後。
function test(){
setTimeout(function() {
throw new Error("something wrong")
}, 1000);
}try{
test()
console.log("fine")
}catch(e){
console.log(e.message)
}
執行結果會印出 fine
,並於之後計時器執行時,發生錯誤。
實務上,call API 時,會是異步處理,可以利用 async await 語法轉為同步,當 call API 失敗時,可以由 catch 處理錯誤。例如:
function callAPI(){
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject("something wrong");
}, 1000);
});
}async function fetchData(){
try{
await callAPI()
}catch(e){
console.log(e)
}
}fetchData()
結果印出 something wrong
。
- 若錯誤處理過程,不需要使用錯誤資訊,也可以忽略 catch 區塊的錯誤參數。
- catch 的錯誤參數僅能於 catch 區塊使用。
➤ finally
若在 try…catch 中,不論執行結果好壞,都有後續想要持續進行的程式碼,可撰寫於 finally 區塊。例如:
async function fetchData(){
try{
await callAPI()
}catch(e){
console.log(e)
}finally{
console.log("other")
}
}
則不論 await callAPI()
成功或失敗,都會印出other
。
- 即使 try 區塊或是 catch 區塊含有 return,finally 區塊內容,仍會在結束 try…catch 語法前完成。例如以下範例,仍可以印出
other
。
async function fetchData(){
try{
await callAPI();
}catch(e){
console.log(e)
return
}finally{
console.log("other")
}
}
- try…finally
如果有些錯誤,想在更外層的地方擷取處理,可以跳過 catch,僅使用 finally 處理必要事項。
async function fetchData(){
try{
await callAPI();
}finally{
console.log("other")
}
}
以上是今天的小筆記分享,有任何問題都歡迎留言指教,謝謝 😊