可能であれば、例外を避けてください。Apple でさえ、それらを避けることを推奨しています:
例外の代わりに、エラー オブジェクト (NSError) と Cocoa エラー配信メカニズムを使用して、Cocoa アプリケーションで予想されるエラーを伝達することをお勧めします。
Error Handling Programming Guideも参照してください(Mac 関連としてマークされていますが、iPhone でも同様に有効であり、同じ概念が適用されます)。
私が知っている例外を回避する理由は次のとおりです。
- それらは、NSError およびアウトポインターを介したレポートよりも遅くなります。
- 注意しないと、メモリ リークが発生する可能性があります。例外による一部のメモリ リークは、まったく回避できません (非 GC 環境では)。
- それらをキャッチするのを忘れて、アプリがクラッシュする可能性があります。
一般に、Objective-C の例外は、多くの場合回復不能な非常に例外的な問題に使用されます。これらは、何か問題が発生する可能性があると予想される領域ではほとんど使用されません (ネットワーク通信など。NSURLConnection
メソッドはこの理由で例外をスローせず、 をエクスポートしますNSError
)。これは、例外がより頻繁に使用される他の言語とは異なる場合があります。私が取り組んできたプロジェクトでは、例外をキャッチして処理する必要があったのは 1 回だけでした (ただし、どのプロジェクトかは思い出せません)。
代わりに、次のようにする必要があります。
// Returns YES when successful.
- (BOOL)doSomething:(NSError **)outError
{
// ...
if (someErrorOccurred) {
if (outError) {
outError = [NSError
errorWithDomain:@"MyErrorDomain"
code:123
userInfo:nil
];
// Or maybe even use your own NSError subclass
return NO;
}
}
// ...
// Operation was successful.
return YES;
}