Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

例外処理

Objective-Cでは、例外処理とスレッド同期をサポートしています。これらについては、この章とスレッド化で説明されています。これらの機能のサポートを有効にするには、GCC (GNU Compiler Collection) v3.3以降の-fobjc-exceptionsスイッチを使用します。

注: プログラムでこれらの機能のいずれかを使用すると、Mac OS X v10.3以降でのみ実行可能なアプリケーションになります。それ以前のバージョンのソフトウェアでは、例外処理と同期のランタイムサポートがないからです。

例外処理

Objective-C言語には、JavaやC++に似た例外処理構文があります。NSExceptionNSError、またはカスタムクラスと併用すると、強力なエラー処理をプログラムに追加することができます。

例外サポートでは、4つのコンパイラディレクティブ、@try@catch@throw、および@finallyが中心になります。例外をスローする可能性のあるコードは@tryブロックに入れます。@catch()ブロックには、@tryブロックでスローされた例外の例外処理ロジックが含まれています。@finallyブロックには、例外がスローされたかどうかに関係なく、実行しなければならないコードが含まれています。例外をスローするには、@throwディレクティブを使用します。このディレクティブは実際にはObjective-Cオブジェクトへのポインタです。NSExceptionオブジェクトを使用できますが、それらに限定されません。

次の例は簡単な例外処理アルゴリズムを示しています。

Cup *cup = [[Cup alloc] init];
 
@try {
    [cup fill];
}
@catch (NSException *exception) {
    NSLog(@"main:Caught %@:%@", [exception name], [exception  reason]);
}
@finally {
    [cup release];
}

例外のスロー

例外をスローするには、例外名や例外をスローする理由など、適切な情報を持ったオブジェクトをインスタンス化する必要があります。

NSException *exception = [NSException exceptionWithName:@"HotTeaException"
                            reason:@"The tea is too hot"  userInfo:nil];
@throw exception;

@catch()ブロック内では、@throwディレクティブを引数なしで使用することで、キャッチした例外を再スローすることができます。これはコードをより読みやすくするのに役立ちます。

NSExceptionをサブクラス化して、ファイルシステム例外や通信例外など、特殊な例外を実装できます。

注: スローするものは、NSExceptionに限定されていません。任意のObjective-Cオブジェクトを例外オブジェクトとしてスローできます。NSExceptionクラスは例外処理に役立つメソッドを提供しますが、必要があれば独自のものを実装することもできます。

例外処理

@tryブロックでスローされた例外をキャッチするには、@tryブロックに続いて、1つまたは複数の@catch()ブロックを使用します。@catch()ブロックは、最も特殊なものから順に最も特殊でないものまで並べます。そうすることで、リスト 9-1に示すように、例外処理をグループとしてまとめることができます。

リスト 9-1  例外ハンドラ

@try {
    ...
}
@catch (CustomException *ce) {  // 1
    ...
}
@catch (NSException *ne) {  // 2
    // このレベルで必要な処理を行う。
    ...
 
    // 上位のレベルで処理されるように例外を再スローする。
    @throw;  // 3
}
@catch (id ue) {
    ...
}
@finally {  // 4
    // 例外が発生したかどうかにかかわらず行う必要のある処理を実行する。
    ...
}

次のリストは、番号の付いたコード行の説明です。

  1. 最も特殊なタイプの例外をキャッチする。

  2. より一般的なタイプの例外をキャッチする。

  3. キャッチした例外を再スローする

    例外処理を区分化するため、プログラム内で例外ハンドラをネストすることができます。これにより、メソッドまたは関数が処理できない例外をキャッチした場合、次の例外ハンドラに再スローすることができます。

  4. 例外がスローされたかどうかに関係なく、必ず実行しなければならないクリーンアップ処理を実行します。



< 前ページ次ページ >


Last updated: 2007-10-31




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice