Imは新しいものをobjective-cに導入し、エラーを処理して捕まえるための共通/標準/適切な方法は何か不思議に思っていますか?objective-cのエラーを返す
NSErrorを使ってこれを行うことは可能かもしれませんが、そのことはココアの良いアイデアかハイジャックですか?
Imは新しいものをobjective-cに導入し、エラーを処理して捕まえるための共通/標準/適切な方法は何か不思議に思っていますか?objective-cのエラーを返す
NSErrorを使ってこれを行うことは可能かもしれませんが、そのことはココアの良いアイデアかハイジャックですか?
NSErrorクラスがあることは間違いないと私は確信しています。あなたが表示されます最も一般的なパターンは、のように、NSErrorオブジェクトへのポインタを取る方法です。
- (id)doSomethingWithArgument:(id)arg error:(NSError **)error
方法が何かをやった結果のためにいくつかの値(または多分nil
)を返しますが、場合呼び出しが失敗した場合、失敗に関する詳細が渡されたポインタにNSErrorオブジェクトが配置されます。メソッドでエラーが発生した場合に返される内容を指定するのはドキュメントです。
その他の方法は、@throw
- @catch
ブロックです。ただし、Objective-C @throw
では、例外的に計算コストが高くなる可能性があります。通常は、例外的な状況でのみ例外が発生することを推奨します。
編集:うわー、多くの人が、@throw
例外に関する本当に強い意見を持っていることが分かります。問題に(かなり便利)の解説を要約すると:
error
メソッドを使用するか、NSNotificationのインスタンスをポストします。@throw
/@catch
ブロックを大量に使用している場合は、それらの周囲のロジックに十分注意してください。 Objective-Cは、他のスレッドで実行するメソッドをデタッチする方法や、実行を遅らせる方法など、多くの方法を提供しています。コードを記述する際には、これらの可能性をすべて考慮してください。最後に、別の非常に有効なポイント:あなたがメソッドに渡されたerror
オブジェクトを使用する場合
error
オブジェクトに設定して返します)。
ObjCには、スコープの外側で捕捉されてしまうものもあります。たとえば、NSTimerによって呼び出された場合はどうなりますか?誰が例外をキャッチしようとしていますか(そしてクラッシュを避ける)? ObjC例外は、一般的なObjCイディオムを処理するのに十分強力ではありません。一般的には、プログラミングエラーを処理する場合にのみ便利です。 NSErrorは、一般的な使用のために豊富なエラーオブジェクトが必要な場合は、間違いなく正しい方法です。 –
明確にするために、Cocoaの「本当に例外的な状況」は、ほとんど常にプログラマのエラーを引き起こし、通常は回復不能であるか、適切かつ必要なチェックをすることで少なくとも簡単に回避できます。プログラマに何かを知らせるだけの例外を投げることは、Objective-Cの良い習慣ではありません。そして、今日では、Javaでは、計算コストのためではなく、クライアントコードの複雑さを大幅に増加させるので、 –
この概念を続けると、集中型エラー処理の考え方でさえ、Cocoaの例外よりも優れた実装が得られます。私はしばしば、ユーザーのフィードバックを提供するためにいくつかの中央エラー処理オブジェクトによって観測されるNSNotificationsにエラーを投げます。 NSErrorの再試行ロジックのカプセル化と組み合わせると、「通知を送信して返す」ことが、ユーザーに影響を及ぼすエラーのための非常に効果的なソリューションとなります。 –