---
# System prepended metadata

title: J_try…catch_C
tags: [javascript]

---

[TOC]
# try...catch
try的區塊中放希望成功的內容，如果不成功則交給catch區塊處理，成不成功並不是以true or false判斷，這兩個都代表代碼成功運行，不成功的狀況像是有未宣告變數、函式會報錯的情況等，在不用try...catch時程式碼會直接停下且報錯，try...catch讓我們即使碰到程式碼報錯但其他程式還是可以進行，不會整包壞掉。
以下是我將q1改寫為try...catch用法：

下面的isNonNegativeInteger()中，只要辨識不是非負整數就會丟一個Error出來，所以try中`isNonNegativeInteger(people)`只要不成立就會報錯而跳到catch區塊。
```javascript=
main();

function main(){
    rl.question('好想電影院，判斷電影是否放映\n請輸入購票人數：', (people) => {
        try {
            isNonNegativeInteger(people);
            console.log(playMovie(people));

            rl.close();
        } catch(error) {
            console.log(error.message);

            main();
        }
      });
}
```


---
```javascript=
function isNonNegativeInteger(number){
    const regex = /^\d+$/;
    if(!regex.test(number)){
        throw new Error(`'${number}' 無效，請輸入非負整數。`)
    }
}
```


# 來自維他命C的補充：
## throw
> [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw)

可以強制程式報錯，使程式停止運作

寫在throw後面的程式碼不會執行
```javascript
// 丟出一個新建立的Error物件
// 這個Error物件由name和message組成
// `${e.name}: ${e.message}`
// name通常是Error
// message就是自己寫的文字"我錯了QQ"
throw new Error("我錯了QQ");
console.log("請原諒我"); // 不會執行
```
![image](https://hackmd.io/_uploads/H1f5J1jmR.png)

throw會同時把這個報錯丟到距離最近的catch，如果沒有catch就會像上面那樣噴error停止運行

## try...catch
> [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch)

在try區塊裡面放可能會報錯的程式碼，讓catch可以接到

![image](https://hackmd.io/_uploads/HyivBJi7R.png)


```javascript
try {
    
    throw new Error("我錯了QQ");
    
} catch(e) { // e是自己幫上面丟下來的報錯取的名字
    
    console.log(e); // 整個報錯
    console.log(e.name);  // Error
    console.log(e.message); // 我錯了QQ
    
}

```
用console.error()也有一樣的效果
![image](https://hackmd.io/_uploads/ryVjB1iQC.png)

### try...catch...finally

finally區塊無論有沒有報錯，在程式離開try...catch之前一定會執行

![image](https://hackmd.io/_uploads/SkrvD1oXA.png)

無論如何先求原諒就對ㄌ!!!
![image](https://hackmd.io/_uploads/Sy39wkjmC.png)

