GASのthrow文入門|処理を中断するエラー処理の基本

GASでスクリプトを書いてるんですが、throwってどんな時に使うんですか?エラー処理に使うって聞いたんですが…
猫男
猫男
catman
catman
いい質問だ。throwは、プログラムの中で「これはおかしい」と判断した時に自分でエラーを発生させるための文だ。処理を止めたい時に使えるぞ。

GASにおけるthrow文の使い方

Google Apps Scriptでは、異常な状況に出会ったときに throw を使ってエラーを発生させられます。

「これはおかしいから、この先の処理を止めたい!」

なんてときに使う、プログラマ側の強制的なエラー出力です。

throwでエラーを表示したら、その先の処理は進まなくなるのですね。

基本の構文


function checkNumber(num) {
  if (num <= 0) {
    throw new Error("正の数を入力してください");
  }
  return num;
}

この関数では、0以下の数が渡されたら throw を使って処理を中断し、エラーメッセージを出しています。

try-catchでエラーを処理する

でも、throw文がtry-catchの中に含まれていれば処理は止まりません。

throw で発生させたエラーは try-catch で受け取って処理できます。


function main() {
  try {
    const value = checkNumber(-5);
    Logger.log("結果: " + value);
  } catch (e) {
    Logger.log("エラーが発生しました: " + e.message);
  }
}

この例では、さっき出てきたcheckNumber 関数がエラーを投げた時、catch ブロックでメッセージをログに表示しています。

エラーが発生しました: 正の数を入力してください

というエラー文が表示されるはずですね。

GASでのエラー処理の基本も復習してみてください。

https://earthpg.school/gas-error-handling/

 

throwを使う理由

  • 不正な値が渡されたときに処理を止められる
  • エラーメッセージを開発者やログで確認できる
  • 問題が起きた場所を明確にできる
なるほど、throwは自分でエラーを出して、ちゃんと気づけるようにするためのものなんですね!
猫男
猫男
catman
catman
その通り!「おかしいな」と思ったらthrowでしっかり止めて、後でcatchで対応する。これが基本だ。

 

練習問題

以下の関数 processScore は、テストの点数を受け取って2倍して返す関数です。
ただし、負の点数が渡されたときは処理を止めてエラーを出すように修正してください。


function processScore(score) {
  // TODO: 負の点数のときにエラーを投げる
  return score * 2;
}

function run() {
  try {
    const result = processScore(-10);
    Logger.log("結果: " + result);
  } catch (e) {
    Logger.log("エラーが発生しました: " + e.message);
  }
}

解答と解説


function processScore(score) {
  if (score < 0) {
    throw new Error("点数は0以上でなければなりません");
  }
  return score * 2;
}

function run() {
  try {
    const result = processScore(-10);
    Logger.log("結果: " + result);
  } catch (e) {
    Logger.log("エラーが発生しました: " + e.message);
  }
}

score が0未満だった場合に throw を使ってエラーを発生させています。

このように、「ありえない値が来たら throw で止める」という書き方は、GASだけでなく他の言語でもよく使われる安全な書き方です。