ネットに上がっている様々なInDesign用のExtendedScriptを拝見していくと、きちんと条件判断でエラー回避をしてあるものが多く、どれだけ努力をしたらこんな風に信頼性の高いものを作れるようになるのかと、途方に暮れることがあります。
全く先は長い、長すぎるのですが、いろんなものを真似して、理解して、いじってみて…を繰り返していこうと思っています。
「try...catch」って何ですか?
ネットでいろいろダウンロードさせていただいたものを見ていると「try...catch」というものをみかけることがあります。最初の頃はいつもの通り「何ですか?これ」という感じだったのですが、調べてみると「予期せぬエラーでプログラムが停止するのを避ける」とありました。tryブロック内で例外が発生したなら、その例外を捕まえて、catchブロックに処理を移す、ということでした。
try...catchを使ってエラー回避
例えば、選択しているオブジェクトをコピペするというScriptで、オブジェクトが選択されている前提でしたら
app.copy(); app.paste();
これだけで選択オブジェクトのコピペができます。
しかし、もし何も選択されていない状態でしたら、エラーで止まってしまいます。
ここで「try...catch」を使って以下のようにエラーを回避すれば、何も選択していない状態でも停止することはありません。
try { app.copy(); app.paste(); } catch(e) {}
try...catchの書き方としては、
try {
処理内容
}catch(e){
エラーだったときの処理
}
となります。
上の例のように、catch(e)のあとの{}に何も書いてない場合は、何もしないということになります。しかし、これは危険なのでおすすめできないとか…。なぜ危険なのかと言うと、例外が発生していることが誰にも分からないからで、例外が発生した後も、プログラムは何事もなかったかのごとく動き続けてしまうからとのこと。
なるほど、気を付けていきたいと思います。
ちなみに、この(e)はエラー内容をいれる変数だそうで、べつにeでなくても構わないそうですが、おもしろいなと思ったのはcatch(e){}の中にalert(e)と入れてみると、
上記の例ではInDesignがちゃんとエラー内容を表示してくれました。
try { app.copy(); app.paste(); } catch(e) { alert(e); }
try...catchよりも条件判断でエラー回避できる場合はif文を使う
例題がよくないとは思いますが、こんな簡単なものはif文を使って書く癖をつけた方がよさそうです。今回のコピペの例では以下のようにした方がいいのかな?
if(app.activeDocument.selection.length>0){ app.copy(); app.paste(); }else{ alert("オブジェクトを選択してください"); }