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 公式アカウントです。
漫画(まんが)・コミックの新刊情報を毎日配信中!
コーヒーブレイク
毎日を懊悩して暮らす青年漫画家の藤沼。ただ彼には、彼にしか起きない特別な症状を持ち合わせていた。それは…時間が巻き戻るということ! この現象、藤沼にもたらすものは輝く未来? それとも…。
この記事が気に入ったらサポートをしてみませんか?