116

独自のフレームワークのエラードメインの設定に関する以前のSO投稿がありますが、独自のプロジェクト/アプリのエラードメインとカスタムエラーコードの設定に関するベストプラクティスは何ですか?

たとえば、多くの検証を行うCore Dataを多用するアプリで作業している場合、「既成の」Core Dataエラーコード(NSManagedObjectValidationErrorfromなどCoreDataErrors.h)をそのまま使用するか、独自のエラーコードを作成してMyAppErrors.hエラーを定義する必要があります。より特異性(すなわち、MyAppValidationErrorInvalidCombinationOfLimbs

カスタムエラードメインと一連のエラーコードを作成すると、コードの曖昧さを大幅に解消できますが、維持するにはオーバーヘッドが大きすぎて、エラーコード番号の競合について心配する必要がありますか?それともここに他の懸念がありますか?

4

3 に答える 3

153

私は個人的に逆引きDNSスタイルのドメインを使用しています。例えば:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

ドメインの3番目の部分(@"myproject")は、このプロジェクトのエラー("My Project")と別のプロジェクトのエラー("My Other Project"=> com.davedelong.myotherproject)を区別するために使用されます。

これは、開発者が意図的に私だけを台無しにしようとしている場合を除いて、他の人のエラードメインと競合しないようにするための簡単な方法です(サードパーティのコードを使用している場合) 。 ..)。

コード番号の競合については、心配しないでください。コードがドメイン内で一意である限り、問題はありません。

エラーの翻訳に関しては、それはあなた次第です。何をするにしても、それをうまく文書化するようにしてください。 個人的には、フレームワークで生成されたエラーが発生したときに、それらを渡すだけです。すべてのコードを処理し、すべてのuserInfoをプロジェクトに固有の何かに変換するかどうかはまったくわかりません。フレームワークは、コードを変更して追加したり、既存のコードの意味を変更したりする可能性があります。また、エラーの原因をより具体的に特定するのにも役立ちます。たとえば、StackKitフレームワークがドメインでエラーを生成した場合、com.stackkitそれがフレームワークの問題であることがわかります。ただし、でエラーが発生した場合は、NSURLErrorDomain特にURL読み込みメカニズムが原因であることがわかります。

フレームワークで生成されたエラーをキャプチャし、ドメインと汎用コードなど含む新しいエラーオブジェクトにラップしてからkFrameworkErrorCodeUnknown、キャプチャしたエラーをのuserInfo下に配置しNSUnderlyingErrorKeyます。CoreDataはこれを頻繁に行います(たとえば、を実行しようとして、save:関係のNSManagedObjectContext整合性エラーが発生した場合、単一のエラーが返されますが、NSUnderlyingErrorKey具体的にどの関係が間違っているかなど、より多くの情報が含まれます)。

于 2010-07-18T16:45:02.657 に答える
38

[[NSBundle mainBundle] bundleIdentifier]コメントするのに十分な担当者がいませんが、Dave DeLongが受け入れた回答については、の代わりに使用する方が少し良いかもしれません@"com.myName.myProject"。このように、名前やプロジェクトの名前を変更すると、正確に反映されます。

于 2014-08-28T23:18:31.643 に答える
5

カスタムNSErrorを作成する方法:

まず、エラーメッセージの辞書を作成します

NSDictionary *userInfo = @{   
   NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil)
                                               };
NSError *error = [NSError errorWithDomain:[[NSBundle mainBundle] bundleIdentifier] 
  code:-58 userInfo:userInfo];

次に、userInfoをNSDictionaryに割り当てて完了です。

于 2018-04-24T07:52:20.920 に答える