きりかノート 3冊め

おあそびプログラミング

Cocoa の例外についての詳しい説明 @MacDevCenter

MacDevCenter の新作 "Understanding Exceptions and Handlers in Cocoa" が 7ページの大作。この記事は、Cocoa/Objective-C の例外処理について説明したもの。Cocoa の例外は、MacOS X 10.3 から導入されたものなので、2007 年の今では、ほとんどの Mac 環境で利用できるでしょう。

ざっと概観を。6, 7 ページあたりは、ある程度経験のある Cocoa プログラマでも知らなかったりするのではないだろーか(そんだけ重要でもない、という考えもあり)。

1-3 基本

はじめの 3 ページでは、Cocoa の例外についての基本的なことを説明している。知っている人はとばしてかまわない。

  • NSException クラス
  • @try, @catch, @finally ディレクティブ
  • コンパイラへの -fobjc-exceptions オプションの指定
  • 実際のコード例

JavaRuby などの他の言語では、例外のクラスでその例外を識別する。Cocoa では、例外はすべて NSException クラスであり、その名前 -[NSException name] で区別するというところが、他のプログラミング言語の経験者にはひっかかりがちかもしんない。

4 実は例外じゃなくても catch できる

4 ページでは @throw, @catch により、例外でないオブジェクト(例では NSNumber)も 扱える、という話。知らなかったよ、これは。Ruby の throw に近いのかな。あまり使わないけれど。

Google Code Search で検索してみた

 @catch (id exc) {

とかゴーカイなのが。UnitKit(ドメインが売り出し中になってて、本家サイトがみつからない)か、ならわかるな。

4-5 try-catch のネスト

4 ページの後半から、5 ページに渡って、try-catch がネストしているときの振る舞いについて説明している。5 ページめの図を見ればだいたいわかる。

6 catch されなかったら?

6 ページでは、発生した例外が catch されなかったらどうなるかについて説明している。Cocoa 環境では Default Exception Handler によって扱われる。NSApplication 環境下では、自動的に用意され、これが catch されなかった例外を処理している。

また、例外オブジェクトの持っている情報ビットについてくわしく説明していて、最後に例外ハンドラを自作して利用する方法を紹介。なんてマニアックなんだ!

7 NSApplication 下での例外ハンドラの差し替え

6 ページで紹介した例外ハンドラの登録は、NSApplication がないプロセスでの方法だった。最後の 7 ページでは NSApplication のある環境での、例外ハンドラの登録方法を説明している。ようするに、NSApplication の処理が終わったあとで、6 ページと同じ方法で上書きしているんだけど。

このへんは去年の Cocoa 勉強会で川名さんが話していたような気がするのだけど、手元に資料がなくて思い出せない。