iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

try catch的歷史

try catch是一個很古老的結構,最早可以追朔到1960年代,而且後來在許多程式語言中得到了廣泛應用和發展,成為現代程式設計中處理錯誤和例外的重要機制。
而我認識的try catch是在工作室給的js練習題中,學長姊都這樣處理資料驗證時的例外狀況,我其實卡了很久,原因是我不知道為什麼要這樣用,我可以寫但我不知道為什麼,心裡就是過不去。
那時候到處問為什麼非得用try catch去處理其實可以用while迴圈作的事,但一直得不到能說服自己的答案,最後已經問到mentor,得到了一個:畫面與邏輯分開這句話,但其實還是沒有完全地理解。

用流程圖來理解try catch

一開始不知道要做資料驗證的時候

程式小白一開始完全不知道要做資料驗證,開開心心寫了題目所要求的邏輯,覺得自己好棒棒,直到學長姊一陣亂輸入,才發現事情不是那麼單純...

//以prompt()來獲得使用者的輸入值
userInput = prompt("今天有幾個客人呢?請輸入數字");
//checkPlaying()依引數來判斷今天電影有沒有播
const result = checkPlaying(userInput);
//印出結果
console.log(result);

try catch可以依不同例外狀況給不同回應?

接著使用while迴圈來篩選輸入,若使用者輸入的格式不是題目要的,則會要求使用者重新輸入。while條件式裡寫的是要阻擋的條件(像是擋空字串,擋負數之類的)

let userInput = prompt("今天有幾個客人呢?請輸入數字");
//當輸入為空字串(符合while條件式),印出訊息請使用者重新輸入
while (isAmpty(userInput)) {
  console.log("你沒有輸入東西喔,請重新輸入");
  userInput = prompt("今天有幾個客人呢?請輸入數字");
}
//可以多寫幾個while去擋各種奇怪的輸入
const result = checkPlaying(userInput);
console.log(result);


這時候有人跟我說,用try catch可以依擋掉的條件不同而給使用者不同的回應,但我還是鐵齒地不想用,因為覺得我也可以寫好幾個while來做到這件事。

try catch可以把問問題這件事統整在一起,而非到處散落?

後來又有人跟我說,用try catch可以把問問題這件事整合在一起,而非到處散落在主邏輯和處理畫面的程式,就像進主邏輯程式前有個get input,主邏輯內的while迴圈裡也有個get input,但我後來覺得,似乎用do..while就可以改善這樣的狀況。

let is_asked = false;
let userInput ;
do {
  if (is_asked) console.log("無效的輸入");
  userInput = prompt("今天有幾個客人呢?請輸入數字");
  is_asked = true;
} while (!inputPass(userInput));
const result = checkPlaying(userInput);

console.log(result);

我最後理解的try catch能幹嘛

那try catch到底要幹嘛,啊..所謂的畫面與邏輯分離,如果說是用try catch 來處理例外狀況,就像下面的圖這樣,重新取得輸入這件事就交給try catch的結構,而我們又可以回到最一開始的程式小白的狀態,天真可愛地只要單純處理題目要的邏輯這樣。

const main = function () {
  try {
    const userInput = prompt("請問今天有幾個客人?請輸入正整數");
    //驗證寫在checkPlaying裡面,也可拆出來
    const result = checkPlaying(userInput);
    console.log(result);
  } catch (error) {
    console.log(error.message);
    main();
  }
};

main();

今日總結

其實這個體會我只有講給兩個人聽過,一個回應我說:好深奧,一個沒有回應,我也不是很確定以我一個初學者是能體會多少,正確度有多少,本來這篇沒打算寫出來的,但在mentor的鼓勵與文章主題已經快要見底的這一刻,還是決定I don't fxcking care地生出來了,純個人體會,僅供參考。


上一篇
這顆語法糖也太好吃了:async & await
下一篇
一個新世界:first-class function
系列文
超低腦容量學習法遇到javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言