Section 3.13 例外処理(その2)

今回は例外処理の続きってことで、まずは例外を投げてみるね。
例外を投げる…って?
前回Exception クラスのオブジェクトが例外に関する情報を持ってるって言ったよね。
うん。それって catch ブロックで受け取れるんだよね。
前回はファイルを開こうとした時に起こった例外を受け取ったわけだけど、 例外オブジェクトは受け取るだけじゃなくて作ることもできるんだ。
へぇ、そうなんだ。
じゃあ、Exception クラスのオブジェクトを作れば、例外を起こせるってこと?
ううん。オブジェクトを作っただけじゃ例外は起きなくて、 作ったオブジェクトを throw キーワードを使って投げると例外を起こせるんだ。
それが「例外を投げる」ってこと?
うん、そういうこと。
じゃ、実際に例外を投げてみるね。

<例外を投げる例>

function open()
{
    try
    {
        // このブロック内で発生した例外が捕捉されます
        if(selector.openFile())
        {
            // ファイル名の拡張子をチェックして、".wav" になっていなかったら例外を投げます
            if(Storages.extractStorageExt(selector.name) != ".wav")
                throw new Exception(Storages.getLocalName(selector.name) + " は WAVE 形式のファイルではありません。");

            // 例外を投げるとすぐに catch ブロックに移るので、以下のスクリプトは実行されません

            // ファイルが選択された場合はそのファイルを開きます
            buffer.open(selector.name);
            // 開かれたファイル名をウィンドウのタイトルバーに表示します
            caption = Storages.extractStorageName(selector.name) + " が開かれています";
        }
    }
    catch(e)
    {
        // try ブロック内で例外が起きるとこのブロック内のスクリプトが実行されます
        System.inform(e.message, "エラー");  // 例外の内容を表示します
        caption = "ファイルが開かれていません";
    }
}

前回のスクリプトの open メソッド をこのスクリプトで置き換えて、実行してみて。
うん、わかった。
えっと、startup.tjs を選択すればいいの?
うん。

<表示されたメッセージ>

表示されたメッセージ

あっ、前と違うメッセージが表示されたね。
今回表示された例外メッセージは、スクリプトの中で作った例外オブジェクトのメッセージなんだ。
ファイルが選択されると、そのファイル名の拡張子をチェックして、".wav" になってなかったら例外を投げてるの。
extractStorageExt っていうメソッドで拡張子を調べてるの?
ん、そだよ。Storages クラスの extractStorageExt メソッドは、 引数に指定したファイル名の拡張子を . (ドット)も含めて返すメソッド。
ちなみに拡張子がなかったら空文字列が返るよ。
なるほどね。
それで、拡張子が ".wav" じゃなかったら、次の行の throw で例外を投げてるんだよね?
ん、そう。
throw の後に例外オブジェクトを書くと、その例外オブジェクトを投げて、例外を起こせるんだ。
えっと、Exception クラスのコンストラクタには引数が1個あるみたいだけど、これって例外メッセージ?
そだよ。
つまり、message プロパティで参照できるメッセージってことだね。
getLocalName っていうメソッドがあるけど、これってどんなメソッド?
これは統一ストレージ名を OS ネイティブの形式に変換するメソッドだよ。
§2.7 でメモ帳を起動する時に使ったよね。
あ〜、そういえば shellExecute メソッドでメモ帳を起動する時に使ったっけ。
確か getLocalName メソッドで Windows のファイル名の書き方に直さないとファイルが開けないんだったよね。
そうそう。今回は別に変換する必要はないんだけど、統一ストレージ名で "file://./c/tjs/test/startup.tjs" って表示するより、 "c:\tjs\test\startup.tjs" って表示した方が見慣れた書き方だからわかりやすいでしょ。
だから getLocalName メソッドでファイル名を変換したってワケ。
なるほどね〜。
ちなみに、今回は説明のためにここで例外を投げたんだけど、 ファイルのチェックは WaveSoundBuffer クラスの open メソッドがやってくれるから、 ホントはわざわざファイル名をチェックする必要はないんだけどね。
あ、そうなんだ…
じゃあ何か別の例にしたほうが良かったんじゃ…?
う、まぁそうなんだけど…
どこで例外チェックが必要かってことをちゃんと考えてスクリプトを書いてね、ってことで。
なんかごまかされてる気が…
まぁまぁ。
えっと、例外処理については大体こんな感じね。
ん〜、まぁ一応例外処理がどんなものかは解ったよ。
うん、それなら OK。
それじゃ、また次回ね〜。


前へ | TOP | 次へ