例外処理でエラーを検知する

例外処理とは

GASではスクリプトを実行すると、想定しないエラーが発生することがあります。
次のサンプルを実行するとエラーが発生して、スクリプトはその時点で止まってしまいます。
このように発生するエラーを例外といいます。

function outputException_1() {
  Browser.MsgBox('Hello');
}

TypeError: オブジェクト Browser で関数 MsgBox が見つかりません。

今回のサンプルは呼び出しているメソッド名に誤字があるため起こるべくしてエラーが起きていますが、
ユーザーの操作やGASの制限などエラーが発生する要因というのは多岐にわたります。
この全てを想定して処理が落ちないように完全に防ぐのは非常に難しいのですが、例外が発生したときにスクリプトが停止しないようにする 例外処理 が活躍します。
例外処理を使用すると、例外の発生を検知して、発生したエラーに応じて処理を継続したり、処理を分岐したりすることができます。
JavaScriptで例外処理を行う場合はtry catch finally文を使用し、下記のように記述します。

try {
  // 例外を検知する対象となる処理
} catch (変数) {
  // 例外が発生した際に実行する処理
} finally {
  // 例外が起きても起きなくても実行される処理
}

例外が起こりうる(検知したい)処理をtryブロックに記述します。
tryブロック内で例外が発生した場合には、その時点で処理を中断してcatchブロックに処理が移ります。
finallyブロックは例外が起きても起きなくても実行される処理で、不要であれば省略することができます。
先ほどのサンプルに例外処理を追加したのが次のサンプルになります。

function outputException_2() {
  try {
    Browser.MsgBox('Hello');
  } catch(e) {
    console.log('例外が発生しました。: ' + e.message);
  } finally {
    console.log('スクリプトが完了しました!');
  }
}

例外が発生しました。: Browser.MsgBox is not a function
スクリプトが完了しました!

実行すると例外が発生するのですが、処理は止まらずにcatchブロック内の処理が実行され、その後finallyブロック内の処理が実行されます。

サンプルコードで登場した変数eには、例外が発生したときに生成されるErrorオブジェクトが格納されています。
Errorオブジェクトのmessageプロパティにはエラーメッセージが格納されているため、e.messageでエラーメッセージを取り出して表示しています。

throw文

発生した例外を受動的に検知して利用するだけではなく、throw文 を使用することでスクリプト内で能動的に例外を発生させることができます。
このように例外を能動的に発生させることを「例外をスローする」といいます。

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

次のサンプルを実行してみましょう。
実行すると例外が発生し、エラーメッセージに「xに負の数が代入されました。」が表示されます。

function outputException_3() {
  var x = -1;
  if (x < 0) {
    throw new Error('xに負の数が代入されました。');
  }
}

throw文とtry catch文を組み合わせたのが次のサンプルです。
変数xの値が負の数である場合に例外をスローして処理を分岐しています。
function outputException_4() {
  var x = -1;
  try {
    if (x < 0) {
      throw new Error('xに負の数が代入されました。');
    }
  } catch(e) {
    console.log('例外が発生しました。: ' + e.message);
  }
}

例外が発生しました。: xに負の数が代入されました。

制御フローの例外

ここまで登場した制御フローの、通常の処理を変えることができる文を整理してみましょう。

名称 文の意味
break文 ループを途中で抜ける。
continue文 ループ内の今回分の繰り返し処理を終了して、次回分の繰り返し処理に進む。
return文 現在の関数を終了する。(次章で解説します)
throw文 例外ハンドラでキャッチする必要がある例外を示す。