見出し画像

GAS|Exception|fetch|UrlFetchApp|Google Apps Script|開発裏話

マンガポスト日本版」では、Google ドライブ内に保存している「コミックス発売日情報」を参照して、その日付を基に毎日自動配信(ツイート)しています。

ツイートやその他外部 API 使用などで URL フェッチする際、たまにエラーが発生して、スクリプトが停止してしまっていました。

// Makes a request to fetch a URL.
var response = UrlFetchApp.fetch('https://www.mangapost.jp/');

Stackdriver のログを確認する

エラー発生時の Stackdriver のログは以下(一例)です。エラーが発生すると、その後の全ての処理が止まってしまうので、非常に厄介です。

Stackdriver のログ
2019/05/14 0:49:32
エラー
https://mstdn.jp/api/v1/statuses のリクエストに失敗しました(エラー: 522)。サーバー応答の一部: <!DOCTYPE html> <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en-US"> <![endif]--> <!--[if IE 7]> <html class="no-js ie7 oldie" lang="en...(応答の全文を見るには muteHttpExceptions オプションを使用してください) at fetchWithOptions(utils:228) at toot(mastodon:241) at tootMstdnJp(mastodon:191) at tootByDaily(mastodon:120) at doMastodon(mastodon:19) at onDateChanged(main:362)

上記は HTTP ステータスコードが「522」ですが、「404」などでも、このフェッチ実装ではエラーになってしまい、スクリプトが停止してしまいます。「200 (OK)」のリクエスト成功でないと正常(処理継続)とはならないのです。

スクリプトの停止を回避する

では、エラー(例外)をハンドリングして、スクリプトの停止を回避します。以下のようにします。

// Makes a request to fetch a URL.
try {
  var response = UrlFetchApp.fetch('https://cutboss.github.io/');
} catch (e) {
  // error!!!
  Logger.log(e);
}

try…catch 構文で、簡単にスクリプトの停止を回避できます。

Logger.log(e);」と実装してエラーをログ出力しました、以下の通りでした。

[19-05-13 23:45:31:032 PDT] Exception: https://cutboss.github.io/ のリクエストに失敗しました(エラー: 404)。サーバー応答の一部: <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Security-Poli...(応答の全文を見るには muteHttpExceptions オプションを使用してください)

「Exception」について

ところで、GAS の実装は殆ど Javascript と言えますので、発生しているのは Error オブジェクトだと思い込んでいましたが、上記ログの通り、違いました。そのオブジェクトは「Exception」でした。

しかし、「Exception」のリファレンスが GAS にはありませんでした(見つけられなかった)。そこで調べてみたら、以下の通りでした。

// エラーメッセージ
Exception.prototype.message

// エラーの名称
Exception.prototype.name

// このエラーを起こしたファイルへのパス
Exception.prototype.fileName

// このエラーを起こしたファイル内の行番号
Exception.prototype.lineNumber

// スタックトレース
Exception.prototype.stack

// 指定した Exception オブジェクトのソースを含む文字列を返します
Exception.prototype.toSource()

// 指定したオブジェクトを表す文字列を返します
Exception.prototype.toString()

マンガポスト日本版

マンガポスト日本版の Twitter 公式アカウントです。
漫画(まんが)・コミックの新刊情報を毎日配信中!

コーヒーブレイク

毎日を懊悩して暮らす青年漫画家の藤沼。ただ彼には、彼にしか起きない特別な症状を持ち合わせていた。それは…時間が巻き戻るということ! この現象、藤沼にもたらすものは輝く未来? それとも…。

この記事が気に入ったらサポートをしてみませんか?