アマグラミング

プログラミング初心者が勉強したことを復習とメモがてら書いているだけです。

(100)エラーメッセージ

エラーメッセージは出てしまうものです。

なので、なにを間違えているのかは重要です。

エラーメッセージは英語ですが、読むのを面倒だとしてしまえば、

エラーの解決により多くの時間を割かなければなりません。

 

いくつかのエラーについて説明していきましょう。

 

Syntax error

初心者が一番多くお目にかかる構文ミス。文法のミスですね。

endがきちんと入っているか、文字列は閉じられているか、区切りがちゃんと

できているかなどいろいろあります。

 

NameError/NoMethodError

メソッド名や変数名など、綴りを間違えていると出てきがち、

 

ArgumentError

メソッドに渡す引数の数の不一致とか。

 

TypeError

メソッドの期待しているものではないクラスのオブジェクトが渡されている場合。

 

LoadError

requireで指定したライブラリを読み込めない時など。

 

(99)例外を発生させる

例外を発生させるにはraizeメソッドを使います。

自分で条件を判定した結果によって例外を発生させる場合や、直前に補足した例外を

再び発生させて呼び出し元に伝える時に使います。

 

raizeメソッドは形式が4つあります。

 

raize メッセージ

RuntimeErrorを発生させる。新しく作られた例外オブジェクトにメッセージとして

文字列をセットする。

 

raize 例外クラス

例外クラスを発生させる。

 

raize 例外クラス、メッセージ

例外を発生させ、例外オブジェクトにメッセージをセットする。

 

raize

rescue節の外ではRuntimeErrorを発生させます。

rescue節の中では最後に発生した例外($!)を再度発生させる。

 

 

(98)特定の例外を処理させる

rescueの後に例外のクラス名を付けることによって

その例外の時だけ行う処理を書けます。

 

例外もオブジェクトです。

全ての例外はExpentionクラスのサブクラスです。

そしてエラーの種類に応じた例外を定義しています。

 

組み込みの例外クラスは

http://doc.okkez.net/static/1.8.7/library/_builtin.html

ここで確認するとよいと思います。

 

継承関係になっていて、

Exceptionクラスを基にしています。

そのサブクラスにSystemExitクラス、NoMemoryErrorクラスなどがあります。

 

rescue節で指定する例外の種類は例外クラスの例外名です。

rescue節で例外クラスを指定しない場合は

StandardErrorとそのサブクラスが補足されます。

 

 

(97)複数のrescue

複数の種類の例外が発生する可能性があり、個別に対処したい場合、

複数のrescue節を記述することで、処理を分けることができます。

 

begin

  例外を発生させると思われる処理

rescue Expention1, Expention2 => 変数

   Expention1またはExpention2に対する処理

rescue Expention3 => 変数

  Expention3に対する処理

rescue

  それ以外が起こった場合の処理

end

 

 

(96)例外処理その2

例外処理でメソッドの処理全体をくくる場合は

beginとendを省略できる。

 

def piyo

  メソッド定義の処理

rescue => ex

  例外処理

ensure

  後処理

end

 

同様にクラスの定義でもできますが、クラスの定義内で例外が発生すると以降のメソッド定義も行われないので、通常は行わない。

 

 

(95)rescue修飾子

ifやunless修飾子のように、rescueにも修飾子がある。

 

式1 resucue  式2

の形を取る

 

1や2というのは

begin

式1

rescue

式2

end

 

こういうこと

つまり最初の式は例外を発生させると思われる式の方。

 

 

(94)retry

rescue節でretryを用いると処理をもう一度やり直せます。

しかし、何度やっても同じ場合、無限ループになりますので、

そうならないように注意すること。