10

Objective-C に慣れていないので、エラーを処理してキャッチするための一般的/標準的/適切な方法は何だろうと考え始めています。

これを行うために NSError を使用することは可能かもしれませんが、それは良い考えですか、それともココアのハイジャックですか?

4

1 に答える 1

17

それが NSError クラスの目的であると確信しています - エラーの詳細を教えてください。最も一般的なパターンは、次のように NSError オブジェクトへのポインターを受け取るメソッドです。

- (id)doSomethingWithArgument:(id)arg error:(NSError **)error

このメソッドはnil、何かを実行した結果として何らかの値 (または場合によっては ) を返しますが、呼び出しが失敗した場合は、失敗に関する詳細と共に渡されたポインターに NSError オブジェクトを配置します。メソッドでエラーが発生した場合に何が返されるかは、ドキュメントで指定する必要があります。

頭に浮かぶ他の方法は@throw-@catchブロックです。ただし、Objective-C @throwing では、例外はかなり計算コストが高くなる可能性があり、通常は真に例外的な状況でのみ実行することをお勧めします。

編集:うわー、多くの人が@throw例外について非常に強い意見を持っていることがわかりました。この問題に関する(非常に役立つ)コメントを要約するには:

  • 例外のスローは、ほとんどの場合、プログラマーのエラー (発生してはならない状況など) に対処する必要があります。通常のエラー処理に例外を使用しないでください。代わりに、error上記の方法を使用するか、NSNotification のインスタンスを投稿してください。
  • @throw/ブロックを大量に使用することになった場合は@catch、それらを取り巻くロジックに十分注意してください。Objective-C には、メソッドを分離して他のスレッドで実行したり、実行を遅らせたりする方法がたくさんあります。コードを記述するときは、これらすべての可能性を考慮してください。

最後に、もう 1 つの非常に有効なポイント:

  • メソッドに渡されたオブジェクトを使用する場合error、戻り値はそれを示す必要があります。両方を実行しようとしないでください (部分的に有効なオブジェクトを返し、オブジェクト設定しerrorます)。
于 2009-10-01T11:27:59.360 に答える