學習軌道
/
JavaScript
JavaScript
/
練習
/
工廠感測器
工廠感測器

工廠感測器

學習練習

簡介

錯誤

當程式或某段程式碼出錯,或發生預期之外的情況時,回報錯誤是很有用的。

它們是 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 是報紙工廠的新任品質經理。因為她才剛到公司,她決定檢視工廠內的一些流程,看看有什麼可以改善的地方。 她發現技術人員做了很多手動的品質檢查。 她看到自動化的大好機會,於是請你這位自由接案的開發者開發一套軟體來監控部分機器。

1. 監控房間的濕度

你的第一個任務是寫一套軟體來監控生產室的濕度。公司軟體已經連接了一個感測器,會定期回傳房間的濕度百分比。

你需要在軟體中實作一個函式,當濕度百分比過高時拋出錯誤。 這個函式應該命名為checkHumidityLevel,並接受濕度百分比作為參數。

如果百分比超過 70%,你應該拋出錯誤(訊息內容不重要)。

checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error

2. 偵測過熱

Elena 對你的第一項任務非常滿意,並請你負責監控機器的溫度。 和技術人員 Greg 聊天時,你得知如果機器的溫度超過 500°C,技術人員就會開始擔心過熱。

機器配備了一個感測器,用來測量內部溫度。 你要知道,這個感測器非常敏感,而且經常故障。 在這種情況下,技術人員就得把它換掉。

你的工作是實作一個函式reportOverheating,它接受溫度作為參數,並在感測器故障或機器開始過熱時拋出錯誤。 由於之後需要根據錯誤做出不同的反應,你需要一個機制來區分這兩種錯誤。 你可以依賴錯誤訊息,但這會讓程式碼變得脆弱,因為訊息一旦更新就會失效。 所以要妥善做到這一點,你會拋出不同錯誤類別的實例。

  • 如果感測器故障,溫度會是null。 在這種情況下,你應該拋出ArgumentError。
  • 當一切正常運作時,如果溫度超過 500°C,你應該拋出OverheatingError。 這個錯誤類別會以溫度引數來實例化。 請確保你拋出的OverheatingError帶有 temperature 屬性。
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. 監控機器

現在你的機器可以偵測錯誤了,你將實作一個函式,以不同方式對這些錯誤做出反應:

  • 如果感測器故障,你需要警告技術人員
  • 如果溫度過高,當溫度超過 600°C 時你要關閉機器,若低於 600°C 則開啟警示燈。
  • 如果發生其他錯誤,你將重新拋出它。

實作一個函式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,
});
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
JavaScript Exercism

準備好開始 工廠感測器 了嗎?

註冊 Exercism,透過 37 個概念159 個練習 和真人引導來學習並精通 JavaScript,全部免費。