2009-10-01 9 views
10

Imは新しいものをobjective-cに導入し、エラーを処理して捕まえるための共通/標準/適切な方法は何か不思議に思っていますか?objective-cのエラーを返す

NSErrorを使ってこれを行うことは可能かもしれませんが、そのことはココアの良いアイデアかハイジャックですか?

答えて

17

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オブジェクトに設定して返します)。
+2

ObjCには、スコープの外側で捕捉されてしまうものもあります。たとえば、NSTimerによって呼び出された場合はどうなりますか?誰が例外をキャッチしようとしていますか(そしてクラッシュを避ける)? ObjC例外は、一般的なObjCイディオムを処理するのに十分強力ではありません。一般的には、プログラミングエラーを処理する場合にのみ便利です。 NSErrorは、一般的な使用のために豊富なエラーオブジェクトが必要な場合は、間違いなく正しい方法です。 –

+2

明確にするために、Cocoaの「本当に例外的な状況」は、ほとんど常にプログラマのエラーを引き起こし、通常は回復不能であるか、適切かつ必要なチェックをすることで少なくとも簡単に回避できます。プログラマに何かを知らせるだけの例外を投げることは、Objective-Cの良い習慣ではありません。そして、今日では、Javaでは、計算コストのためではなく、クライアントコードの複雑さを大幅に増加させるので、 –

+4

この概念を続けると、集中型エラー処理の考え方でさえ、Cocoaの例外よりも優れた実装が得られます。私はしばしば、ユーザーのフィードバックを提供するためにいくつかの中央エラー処理オブジェクトによって観測されるNSNotificationsにエラーを投げます。 NSErrorの再試行ロジックのカプセル化と組み合わせると、「通知を送信して返す」ことが、ユーザーに影響を及ぼすエラーのための非常に効果的なソリューションとなります。 –

関連する問題