iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
1
Software Development

為什麼世界需要Typescript系列 第 21

錯誤種類 - 21

當 Javascript 應用程式執行的過程中發生錯誤時, 它會丟出例外狀況(throw exception), Javascript並不會繼續往下執行, 它會尋找有沒有任何 try-catch 程式區塊? 如果沒有就終止, 如果有就執行 catch 內的程式碼.

典型的try-catch 寫法如下

try {
   // code 
}catch(e) {
   // ...
}

在一般的應用程式中想要丟例外錯誤, 則是這樣寫

throw new Error("error message");

如果獲取到例外錯誤, 處理完例外錯誤之後, 又想往外丟例外錯誤, 則可以按照下面示範寫

try {
   ...
}catch(e) {
   // 
   throw e;
}

Javascript Error 錯誤種類

Error 是Javascript 內建的錯誤物件. Javascript 提供了以下數個錯誤種類

  • Error 一般錯誤

Error 物件包含了兩個屬性name 和 message

var error = new Error("error message");
console.log(error.name);
console.log(error.message);
  • RangeError 超過範圍錯誤

例如

var pi = 3.14;
pi.toFixed(1000);

將會噴出RangeError 例外錯誤

Uncaught RangeError: toFixed() digits argument must be between 0 and 100
   at Number.toFixed (<anonymous>)
  • ReferenceError 參考找不到錯誤

當應用程式試圖存取一個不存在的變數時

console.log(javascript);

會拋出 ReferenceError 例外錯誤

Uncaught ReferenceError: javascript is not defined
  • SyntaxError 語法錯誤

例如不小心打錯以下程式碼

for(var i=0, i<1, i++)

會拋出下面錯誤

Uncaught SyntaxError: Unexpected token <
  • TypeError 找不到定義
var seafood = {};
seafood.sayHello();

會拋出以下錯誤

Uncaught TypeError: seafood.sayHello is not a function

如果想要獲取例外錯誤種類, 在Javascript 可以這樣寫

try {
   ...
}catch(e) {
  if (exception instanceof TypeError) {
    ...
  } else if (exception instanceof ReferenceError) {
    ...
  } else {
    ...
  }
}

在Javascript 想要自訂例外錯誤的話, 標準的寫法要這樣做

function CustomError(message) {
  this.name = 'CustomError';
  this.message = message;
}

CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError;

假如我們在Typescript 要自訂例外錯誤, 我們必須遵照Javascript 自訂例外錯誤寫法, 我們可以這樣寫

class CustomError extends Error {
   constructor(message?: string) {
      super(message);
      Object.setPrototypeOf(this, new.target.prototype);
      this.name = CustomError.name;
   }
}

你可以注意到

Object.setPrototypeOf(this, new.target.prototype);

相當於

CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError;

在Typescript 如果要獲取自訂的例外錯誤, 跟Javascript 獲取方式一模一樣沒有改變, 請按照下面示範寫,

try {
   throw new CustomError();
} 
catch(e) {
   if(e instanceof CustomError) {
      // 錯誤處理動作
   }
   else {
      // 一般的 Error 錯誤
   }
}

playFun 例外錯誤處理

回到剛剛的遊戲服務 playFun 方法中有許多 logError, 我們可以統一規範所有的方法, 只要方法有任何錯誤, 我們一律都丟例外錯誤 -- PlayFunError

先前有示範過如何撰寫自訂例外錯誤, 我們定義一個 PlayFunError 例外錯誤

class PlayFunError extends Error {
   constructor(message?: string) {
      super(message);
      Object.setPrototypeOf(this, new.target.prototype);
      this.name = PlayFunError.name;
   }
}

上一篇
狀態模式(State Pattern) - 20
下一篇
裝飾者模式 - 22
系列文
為什麼世界需要Typescript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言