web-dev-qa-db-ja.com

ベストプラクティス-独自のプロジェクト/アプリのNSErrorドメインとコード

previous SO post 独自のフレームワークのエラードメインのセットアップに関してはありますが、エラードメインとカスタムエラーコードのセットアップに関するベストプラクティスは何ですかあなた自身のプロジェクト/アプリ用

たとえば、多くの検証が行われているコアデータ集約型アプリで作業している場合、「既製」のコアデータエラーコード(NSManagedObjectValidationError from CoreDataErrors.h)または独自のMyAppErrors.hおよびエラーをより具体的に定義します(つまり、MyAppValidationErrorInvalidCombinationOfLimbs

カスタムエラードメインと一連のエラーコードを作成すると、コードが大幅に曖昧になる可能性がありますが、維持するのにオーバーヘッドが大きすぎ、エラーコードの番号の競合を心配する必要がありますか?または、他の懸念事項はありますか?

109
Neal L

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

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

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

開発者が意図的にjust me(これを混乱させることを試みている場合を除き、他の誰かのエラードメインと競合しないことを保証する簡単な方法です(サードパーティのコードを使用している場合)私は非常にありそうもないと信じています...)。

コードの番号付けの競合については、心配する必要はありません。コードが一意である限りドメイン内であれば、問題ありません。

エラーの翻訳に関しては、あなた次第です。何をするにせよ、それをよく文書化してください。 Personally、すべてのコードを処理し、すべてのuserInfoをより具体的なものに変換するかどうかはよくわからないため、通常はフレームワークで生成されたエラーを受け取ります。私のプロジェクト。フレームワークは、コードを変更および追加したり、既存のコードの意味を変更したりできます。また、エラーの原因をより具体的に特定するのにも役立ちます。たとえば、my StackKit frameworkがcom.stackkitドメイン、私はそれがフレームワークの問題であることを知っています。ただし、NSURLErrorDomainでエラーが生成された場合は、特にURLロードメカニズムに由来することがわかります。

couldで行うことは、フレームワークで生成されたエラーをキャプチャし、ドメインとkFrameworkErrorCodeUnknownなどの汎用コードを含む新しいエラーオブジェクトにラップし、キャプチャしたファイルを配置することです。 userInfoの下のNSUnderlyingErrorKeyにエラーがあります。 CoreDataはこれを多く行います(たとえば、save: an NSManagedObjectContext、ただしリレーションシップの整合性エラーがある場合、1つのエラーが返されますが、NSUnderlyingErrorKeyには、特にどのリレーションシップが間違っているかなど、より多くの情報が含まれます。

148
Dave DeLong

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

35
Connor

カスタム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に割り当て、完了します。

4
Mike Zriel