NSError **
多くの Cocoa メソッドは、エラーを報告するために使用するオプションの引数を取ります。エラーが発生する唯一の方法が、予期しないランタイム条件ではなく、自分の側のプログラミング エラーによるものである状況でも、このようなメソッドを使用していることに気付くことがよくあります。そのため、ユーザーに表示されることを行うエラー処理コードを書きたくありません。エラーが発生したときに本当にやりたいことは、コードをできるだけ簡潔で読みやすいものに保ちながら、エラーをログに記録する (そしておそらくクラッシュする) ことだけです。
問題は、「コードを簡潔に保つ」という目的と「エラーをログに記録する」という目的が互いに緊張関係にあることです。私は頻繁に次の 2 つのアプローチのどちらかを選択しますが、どちらも嫌いです。
1. エラー ポインタ引数に NULL を渡します。
[managedObjectContext save:NULL];
- 利点: 簡潔で読みやすく、エラーが予期されていないことを明確に示します。ここでのエラーは論理的にありえないという私の信念が正しかった限り、まったく問題ありません。
- 短所: 失敗してエラーが発生した場合、ログに記録されず、デバッグが難しくなります。場合によっては、エラーが発生したことに気付かないこともあります。
2.NSError **
毎回同じ定型コードで、 を渡し、結果のエラーをログに記録します。
NSError *error;
[managedObjectContext save:&error];
if (error) {
NSLog(@"Error while saving: %@", error);
}
- 利点: エラーは黙って渡されません。警告が表示され、デバッグ情報が提供されます。
- 短所:恐ろしく冗長です。書くのも読むのも遅く、インデントのいくつかのレベル内にすでにネストされていると、コードが読みにくくなるように感じます。エラーをログに記録するためだけにこれを日常的に実行し、読み取り中に定型文をスキップすることに慣れると、実行時に発生すると予想されるエラーに対して、実際に読み取り中のコードに重大なエラー処理ブロックがあることに気付かないことがあります。
Python、Java、PHP、Javascript などの言語のバックグラウンドを持っているので、慣れ親しんだ言語ではエラーの種類を通知するために定型文を 4 行も余分に書かなければならないのは面倒だと思います。明示的にエラーをチェックするコードを記述する必要なく、例外または警告を介して調べることができます。
私が理想的に望むのは、すべてのメソッド呼び出しでボイラープレートを記述する必要なく、これらのメソッドによって作成されたエラーを自動的にログに記録するために使用できる狡猾なハックです。これにより、怠惰な NULL 渡しアプローチとエラーの両方の利点が得られます。 -logging ボイラープレート。つまり、次のように書きたいと思います。
[managedObjectContext save:&magicAutologgingError];
メソッドが を作成した場合、NSError
どういうわけか、魔法のようにログに記録されることを知っています。
どうすればいいのかよくわかりません。NSError
自分自身をログに記録するサブクラスを使用することを検討しましたdealloc
が、Cocoa のメソッドが作成するエラー オブジェクトをインスタンス化する責任がないため、サブクラスはいずれにしても使用されないことに気付きました。メソッド スウィズリングを使用して、すべて NSError
の s がこのようにログオンできるdealloc
ようにすることを検討しましたが、それが実際に望ましいかどうかはわかりません。ログに記録したいポインターに使用できるメモリ内の特定の一定のスペースを監視するある種のオブザーバークラスを使用することNSError
を考えましたが、私が知る限り、メモリ内の任意のスペースを監視するためにKVOのようなことをする方法はありません、そのため、ログに記録するエラーを繰り返しチェックするスレッドを持つ以外に、これを実装するためのアプローチがわかりません。
誰でもこれを達成する方法を見ることができますか?