とあるDTPオペレーターのInDesignスクリプト備忘録

デザイナー上がりですがいまはDTP命。InDesign用スクリプトの解説などを綴っています。読者登録して戴けると励みになります。

【入門者向け⑩】try...catchでエラー回避処理

ご無沙汰しています。なかなか浮上できませんが……久々に記事を投稿します。

スクリプトを書いていて、「エラー」はつきものです。
エラーと一言に言っても、スクリプトの書き方に問題がある場合もあれば、InDesignの都合で実行できない場合もあります。

たとえば次のスクリプトを新規ドキュメント上で実行すると……
[例1]

var myDoc = app.activeDocument;

myDoc.layers.add ({name: "テスト"})
alert ("「テスト」レイヤーを追加しました")

「テスト」という名前のレイヤーが追加され、それを知らせるアラートが出てきます。
とくに真新しいところもないようなスクリプトですが、こちらを同じドキュメント上でもう一度実行しようとすると今度はエラーが出てしまいます。
InDesignの仕様上、ドキュメント内に同じ名前のレイヤーを二つ持つことが出来ないからですね。

スクリプトに慣れてきた方は
「だったらドキュメントが持っているレイヤーの名前を取得して、追加しようとしているレイヤー名がすでに存在しないかを調べれば…」
なんて思いつくかもしれません。
でもレイヤーを追加するたびにその処理を書き加えるのは大変ですし、そもそもエラーを吐くのはレイヤーを追加するときだけではありません。
そんなとき、キラ星のように燦然と登場するのがこの命令文です。

try...catch!

ついネイティヴスピーカーっぽく読みたくなりますね。
このtry...catchは何をするための命令文か字面からは想像しにくいですが、

「もしエラーが出たらこうして」

という割とザックリした指示ができる、とても便利な命令文なのです。
人間で言うところの、

「コンビニ行ったらお茶買ってきて。もし(なんらかの理由で)買えなかったらLINEして」

的な「そんな適当な指示で動けるか!」という指示がこのtry...catchで出来るのです。
書き方はこんな感じです。

try {なんらかの処理}
catch(e){エラーだったときの処理}

先ほどの指示をtry...catchを使って書き直すと、

try {
 コンビニ行ってお茶買ってきて
 }catch(e){ ←「買えなかったら」の部分
 LINEして
}

※これをESTKに貼っても動きません※
これだけで、「買えたら買ってくる。(なんらかの理由で)買えなかったらLINEする」という指示が出来てしまいます。
ちなみに「catch」のあとの「e」はエラー内容を入れるための変数らしいです。「alert」や「$.writeln」で確認できます。
eじゃなくても問題はないのですが、Javaスクリプトでは慣習的に「e」をエラー用の変数に使う場合が多いようです。
間違っても「i」とかにしない方がいいです。

また、catch(e)のあとの{}の中身を空欄にすると、「エラーが出たら何もしない」という処理になります。

それでは[例1]のスクリプトを、エラー処理を加えて書き直してみましょう。

[例2]

var myDoc = app.activeDocument;

try {
    myDoc.layers.add ({name: "テスト"})
    alert ("「テスト」レイヤーを追加しました")
    } catch (e) {
            alert ("「テスト」レイヤーを追加できませんでした。もうすでにあるのかも…?")
        }

新規ドキュメント上で実行すると、冒頭の理由から1回目と2回目とで処理が変わるのが分かると思います。
このように、try...catchはとても便利な命令です。
「なんか、エラー出そうだな」って部分に施しておくと、通常なら引っかかるような場所もすんなり動いてくれたりします。

try~を覚えたての頃はif文を書くのを面倒くさがってtry~で済ませようとしがちですが、あまり甘えるとすると自分の予想の斜め上を行く動作をされて泣くことになりますので、そんなときは丁寧にif文を書きましょう。