Learning to program - The Basics - Error Handling

A Brief History of Error Handling

VBScript周りはまぁ、わかったようなわからんようなで、VBScriptのソースの0でDevideしようとするとおそらくNullが返される?のかと思うんだけど、そうなってない感じ。その辺だけはまぁいいかなぁと。もしかしてアルファベットとか入れるとそのまま停止してしまうから、停止しないだけエラーハンドリングになってるということなのか?わからないけど、次に進もう。あぁ、おそらくそういうことだろうな。0でDevideするとNullをResultに入れて、Nullをそのまま表示しているわけじゃなくてそれだと使用するユーザに何が起こったかわからないから、"ERROR: Could not perform operation"と表示して伝えているわけか。
その他の詳しい挙動(エラーハンドリングの分岐あたり)はいまいち理解してないけど進もうVBScript特有のものだろうし、もし問題があったら戻ってきても理解できそうだ。VBScript固有のエラーハンドリングの分岐って思ってりゃなんとか大丈夫だと思うがはてどうだろう。

Error Handling in Python
Try/Catch
OK,着実に読んでいけば英語といえど問題ない。急がば回れ、早く成果を出したければ、早くコンピューティングの道を究めたければ極めたいほど、今のこの道を着実に頭を奴隷のごとく使い自由を得るのだ。
要はTry文のブロックの中でいつもどおりプログラムを動かして、そのTry文のいつもどおり動かしているプログラムの中でエラーが起きたらError Handling, Except Handlingすなわちおそらく例外処理に入る。それがexceptのブロックで、対応するエラーごとにそのブロックが実行・処理されるようだ。おそらく対応するエラーというのがどうなったらどういうエラーが出るというのはオフィシャルのドキュメントあたりに触れてあるのだろうが、Alan.Gauld氏はそこまで言及していないようだ。
except: というように、何も特定のエラータイプが示されていない場合は、tryブロック内で起こったあらゆるエラーをキャッチして、そのブロック内のことを実行させるようだ。

Note that an except statement with no specific error type will catch all error types not already handled. In general this is a bad idea, with the exception of the top level of your program where you may want to avoid presenting Python's fairly technical error messages to your users, you can use a general except statement to catch any uncaught errors and display a friendly "shutting down" type message.

最後のelseブロックについてはこのように記述がある。tryブロックが成功ならelseブロックが実行される。

If no errors are found in the try block then the final else block is executed although, in practice, this feature is rarely used.

Try/Finally
なかなか複雑なような気がするが、Try/exceptでエラーをキャッチする場合は、どのようなエラーをキャッチしたいかを知ってないといけないというか、まぁそんな感じで、というか、どのようなエラーをキャッチしたいか、どの部分でエラーをキャッチしたいか考えて使うって感じかなぁ。Try/Finallyの方はエラーが起こっても最終的にはFinallyにつなげるようにしたい場合に考えて設置する(ファイル開いた場合、プログラム終了時に常にファイルを閉じた状態にしたいとか)って感じか。

Generating Errors
これいまいちわからんけど、最初のソースの方は、モジュールでErrorのときにどうするか、またはErrorのときにモジュールに移動して云々するかのどっちかだと思うんだけど、どっちだろう。ちょっといまいちわからん。まぁ、実践例みたいなの出てくりゃわかるんだろうが。
二番目のソースのは大体わかった気がする、

Another use of the raise keyword is to propagate an error to a higher level in the program from within an except block. For example we may want to take some local action, log the error in a file say, but then allow the higher level program to decide what ultimate action to take. It looks like this:

とあるように、

except ZeroDivisionError:
logfile = open("errorlog.txt","w")
logfile.write("datum was 42\n")
logfile.close()
raise

でエラーログ記述したら、そこで終わりにしなくて、一つ上の階層のプログラムにそのエラーが起きた状態をどうするのか渡す、つまりそのまま動かすってことなんだろう。
だからエラーログを記述して、riseの後に、

except ZeroDivisionError:
print "You can't divide by zero, try another value"

が実行されている感じだ。

まぁ、こんな感じの理解でいいだろう。errorlog.txtをcatでみても、ちゃんとログられてるし。そういう感じで動いているんだと思う。

User Defined Exceptions

>>> raise SystemExit

なにこれかっこいい。Object Oriented Programmingについては専門の章があるようなのでそちらに期待する。というか、Pythonって確実にObject Oriented Programmingな言語なのねと最近気づきつつある。気づくの遅いか?でもWikipediaとかでさらっと流してたけど、そういうことなのかと事の重大さを理解しつつあるというか。オブジェクト指向言語ってなんか難解な感じを受けるけど大丈夫かなぁ。w今頃言うなwまぁ、Pythonは初心者向け言語とそこかしこで言われてるようだから大丈夫だと思うが、はやくきちんとしたPythonistaになりたいぜ。コード書いていくようになれば慣れてくるんだろうけどなぁ。早く慣れたいです。

JavaScript
Catching errors
なぜかこのソースコードFirefoxで実行できない。何故だ。まぁいい。どういう仕組みかはわかるから。あ、実行できた出来たwを最後に書いてないからだったwうん、実行結果も予想通り、問題ない。ていうか、Firefoxで見ているJavascriptにエラーがある場合ってどういう風にバグ取りすればいいんだろう。Firebugとかいう専用のアドオンがあることは知ってるけどそこまでじゃないばあいどこ見りゃいいんだ。

Raising errors
特に問題ないように思える。

さぁ、終わったぞ、終わったぞ終わったぞ!

* A simple game such as OXO or Hangman
* A basic database, maybe based on our address book, for storing details of your video, DVD or CD collection.
* A diary utility that will let you store important events or dates and, if you feel really keen, that automatically pops up a reminder.

どれも難しそうだなぁ。

Remember to keep checking the documentation, there will probably be quite a few tools that will make the job easier if you look for them. Also don't forget the power of the Python >>> prompt. Try things out there until you understand how they work then transfer that knowledge into your program - it's how the professionals do it! Most of all, have fun!

おっすおっす。なんかプログラミングはじまったなって感じでおもしろい。やっと俺The Basicsのコース終わったのかぁ。すげー。基礎終了ほっほい!基礎終了ほっほい!基礎終了ほっほい!※これはプログラムでリピートしてません手打ちです。

See you in the Advanced section :-)