Objective-Cのこのような制御フローで例外が使用されることはめったにありません。あなたはJava(または同様の)バックグラウンドを持っていると思います。
私はあなたがこのようなコードを書くことができないと言っているわけではありませんが、あなたのコードを見ている他の人にとっては非常に奇妙に感じ、例外を完全に分離しないと他の人のコードによって使用されるとうまくいかない可能性があります彼らのコードに到達することはありません。
Objective-Cで一般的に行われている方法
例外は重大なエラーに使用されます。エラーが予想される場合(必要なためと思われる@try
場合)、代わりにを試して返す必要がありNSError
ます。これは、FoundationフレームワークとCocoaフレームワーク、およびサードパーティのフレームワーク全体で使用されているデザインパターンです。たとえば、ネットワーキング、ファイルの読み取り/書き込み、またはJSONコードを見てください(JSONObjectWithData:options:error:
)
あなたがすること
メソッドの最後に、次のように失敗する可能性のあるエラーパラメータ(ダブルポインタ)を追加します。
- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
error:(NSError **)error;
誰か(あなたまたは他の誰か)がこのメソッドを使用する場合、次のように、エラーが発生した場合に設定されるNSErrorポインターを渡したい場合に使用できます。
NSError *error = nil; // Assume no error
MyResultObject *result = [self myMethodThatCouldFailWith:myObject
error:&error];
if (!result) {
// An error occurred, you can check the error object for more information.
}
&
エラーパラメータの前のアンパサンド()に注意してください。NSError
これは、エラーポイントを引数として送信しているため、危険なメソッド内で、メソッドが戻った後に読み取ることができる新しいオブジェクトを指すようにポインタを変更できることを意味します。
これで、失敗する可能性のあるメソッド内で、NSError
(例外を発生させる代わりに)何か問題が発生した場合にエラーを新しいオブジェクトに設定します。また、エラーが発生したときに戻ることもよくあります。これはnil
、計算が完了できないか、データの信頼性が低いか、関連性がないことを意味している可能性があります。
- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
error:(NSError **)error {
// Do something "risky" ...
MyResultObject *result = [MyResultObject somethingRiskyWith:myObject];
// Determine if things went wrong
if (!result) {
// Set error if a pointer for the error was given
if (error != NULL) {
*error = [NSError errorWithDomain:yourErrorDomain
code:yourErrorCode
userInfo:optionalDictionaryOfExtraInfo];
}
return nil;
}
// Everything went fine.
return result;
}
これで、エラーが返された場合、指定したエラーコードからエラーの種類を識別でき、ユーザー情報ディクショナリ(多くの情報を追加できます)でより詳細な情報を読み取ることができます。