• ..

    例外処理

    起こす

    throwを使うと、その部分で「何かしら変な事が起きた」ことが返せます。

    throw new Error('エラーメッセージ');

    コメント

    JDOC コメントを残すと他の人の助けになるかもです。

    /**
     * @throws {Error} こんなの時
     */
    function foo() {
      /* ... */
    }

    起こったエラーを扱う

    try-catchを使います。
    tryブロックにはエラーが起こりそうな処理を書きます。もし起きた時、throwされたErrorcatchブロックの引数で受け取れます。

    try {
      foo();
    } catch (err) {
      console.log(err);
      // Error: エラーメッセージ
      //   at Object.<anonymous>
    
      // ここで扱えないなら再度 throw したり
      // throw err;
    }

    よく使うエラー

    最低限Errorにだけはして返すといいと思います。

    TypeError

    TypeError オブジェクトは、値が期待される型でない場合のエラーを表します。 TypeError - JavaScript | MDN

    引数の型などに想定外の型を渡された時などに使います。

    /**
     * @throws {TypeError} num が数値じゃない時
     */
    const plusOne = num => {
      if (typeof num !== 'number') {
        throw new TypeError('数値を渡してください');
      }
    
      return num + 1;
    };

    SyntaxError

    構文的に不正なコードを解釈しようとした場合のエラーを表します。 SyntaxError - JavaScript | MDN

    渡された文字列をパースする関数などで、想定外の形の文字列を渡された時などに使います。

    const parse = str => {
      const re = /* 正規表現 */;
      if (!re.test(str)) {
        throw new SyntaxError('文字列の形が不正です')
      }
    
      return Foo.parse(str);
    }

    自分で作る

    Errorクラスを継承して自分のErrorクラスを作ることができます。
    Error.captureStackTraceはスタックトレースから無駄を減らしてくれます。

    class MyError extends Error {
      constructor(message) {
        super(message);
        Error.captureStackTrace(this, MyError);
      }
    }
    
    const foo = () => {
      /* ... */
      throw new MyError('エラー!!');
      /* ... */
    };
    
    try {
      foo();
    } catch (err) {
      console.log(err instanceof MyError); // true
    }