try catch是一個很古老的結構,最早可以追朔到1960年代,而且後來在許多程式語言中得到了廣泛應用和發展,成為現代程式設計中處理錯誤和例外的重要機制。
而我認識的try catch是在工作室給的js練習題中,學長姊都這樣處理資料驗證時的例外狀況,我其實卡了很久,原因是我不知道為什麼要這樣用,我可以寫但我不知道為什麼,心裡就是過不去。
那時候到處問為什麼非得用try catch去處理其實可以用while迴圈作的事,但一直得不到能說服自己的答案,最後已經問到mentor,得到了一個:畫面與邏輯分開這句話,但其實還是沒有完全地理解。
程式小白一開始完全不知道要做資料驗證,開開心心寫了題目所要求的邏輯,覺得自己好棒棒,直到學長姊一陣亂輸入,才發現事情不是那麼單純...
//以prompt()來獲得使用者的輸入值
userInput = prompt("今天有幾個客人呢?請輸入數字");
//checkPlaying()依引數來判斷今天電影有沒有播
const result = checkPlaying(userInput);
//印出結果
console.log(result);
接著使用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可以把問問題這件事整合在一起,而非到處散落在主邏輯和處理畫面的程式,就像進主邏輯程式前有個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的結構,而我們又可以回到最一開始的程式小白的狀態,天真可愛地只要單純處理題目要的邏輯這樣。
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地生出來了,純個人體會,僅供參考。