當程式或某段程式碼出錯,或發生預期之外的情況時,回報錯誤是很有用的。
它們是 javascript 物件。
這個物件最主要的屬性是message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
使用throw語法,你可以拋出一個 Error。
throw new Error('Oops');
當錯誤被拋出時,目前的執行會停止,並在呼叫堆疊中第一個 catch 區塊繼續執行。
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
繼承是一種在類別之間建立父子關係的方式。 子類別(有時也稱作 subclass)可以取用父類別(有時也稱作 superclass)所定義的行為與資料。
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
子類別宣告中的extends關鍵字,會透過原型鏈建立與父類別的關係。
由子類別建構函式建立的物件,其原型鏈中會包含父類別的原型,因此可以取用父類別所定義的任何方法或資料。
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
和 JavaScript 中的任何類別一樣,子類別可以透過extends關鍵字繼承Error,來建立自訂的錯誤。
instanceof語法會檢查捕捉到的錯誤,是否為某個特定Error子類別的實例。
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
Elena 是報紙工廠的新任品質經理。因為她才剛到公司,她決定檢視工廠內的一些流程,看看有什麼可以改善的地方。 她發現技術人員做了很多手動的品質檢查。 她看到自動化的大好機會,於是請你這位自由接案的開發者開發一套軟體來監控部分機器。
你的第一個任務是寫一套軟體來監控生產室的濕度。公司軟體已經連接了一個感測器,會定期回傳房間的濕度百分比。
你需要在軟體中實作一個函式,當濕度百分比過高時拋出錯誤。
這個函式應該命名為checkHumidityLevel,並接受濕度百分比作為參數。
如果百分比超過 70%,你應該拋出錯誤(訊息內容不重要)。
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Elena 對你的第一項任務非常滿意,並請你負責監控機器的溫度。 和技術人員 Greg 聊天時,你得知如果機器的溫度超過 500°C,技術人員就會開始擔心過熱。
機器配備了一個感測器,用來測量內部溫度。 你要知道,這個感測器非常敏感,而且經常故障。 在這種情況下,技術人員就得把它換掉。
你的工作是實作一個函式reportOverheating,它接受溫度作為參數,並在感測器故障或機器開始過熱時拋出錯誤。
由於之後需要根據錯誤做出不同的反應,你需要一個機制來區分這兩種錯誤。
你可以依賴錯誤訊息,但這會讓程式碼變得脆弱,因為訊息一旦更新就會失效。
所以要妥善做到這一點,你會拋出不同錯誤類別的實例。
null。
在這種情況下,你應該拋出ArgumentError。OverheatingError。
這個錯誤類別會以溫度引數來實例化。
請確保你拋出的OverheatingError帶有 temperature 屬性。reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
現在你的機器可以偵測錯誤了,你將實作一個函式,以不同方式對這些錯誤做出反應:
實作一個函式monitorTheMachine,它接受一個引數actions。
actions是一個具有 4 個屬性的物件:
| property | description |
|---|---|
check |
一個 函式。檢查機器的溫度。它可能會拋出各種錯誤。 |
alertDeadSensor |
一個 函式。警告技術人員溫度感測器已失效。 |
alertOverheating |
一個 函式。會開啟機器上的警示燈。 |
shutdown |
一個 函式。會關閉機器。 |
monitorTheMachine(actions)函式應該在內部呼叫check()。
如果通過,這個函式不應該回傳任何東西。
如果它throw了一個錯誤,則預期會有不同的行為:
| exception | expected behaviour |
|---|---|
ArgumentError |
呼叫alertDeadSensor函式。 |
OverheatingError |
執行過熱處理程序。 |
| (其他任何情況) | 重新拋出錯誤 |
過熱處理程序
如果溫度低於 600 °C,呼叫alertOverheating函式來開啟警示燈。
如果溫度超過 600 °C,情況危急,因此呼叫shutdown函式。
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});