代码之家  ›  专栏  ›  技术社区  ›  Neal L

最佳实践-您自己的项目/应用程序的错误域和代码

  •  105
  • Neal L  · 技术社区  · 14 年前

    有一个 previous SO post 关于为您自己的框架设置错误域,但是关于设置错误域和自定义错误代码的最佳实践是什么? 对于您自己的项目/应用程序 ?

    例如,假设您正在开发一个具有大量验证的核心数据密集型应用程序,您是否应该坚持使用“现成”的核心数据错误代码(例如 NSManagedObjectValidationError CoreDataErrors.h )或者你应该创造自己的 MyAppErrors.h 并定义更具体的错误(即, MyAppValidationErrorInvalidCombinationOfLimbs ?

    创建一个自定义的错误域和一组错误代码可能会显著地消除代码的歧义,但是维护开销是否太大,是否必须担心错误代码编号冲突?或者这里还有其他问题吗?

    3 回复  |  直到 6 年前
        1
  •  145
  •   Dave DeLong    14 年前

    我个人使用反向DNS样式的域。例如:

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

    域的第三部分( @"myproject" )只是用来区分错误和此项目( "My Project" )来自另一个项目中的错误( "My Other Project" = & gt; com.davedelong.myotherproject )

    这是一个简单的方法来确保我不会与其他任何人的错误域发生冲突(如果我使用第三方代码),除非开发人员有意地试图处理 只是 我(我认为这极不可能…)。

    至于代码编号冲突,不用担心。只要代码是唯一的 域内 你应该没事的。

    至于翻译错误,由你决定。无论你做什么,都要确保你能很好地记录下来。 亲自 ,我通常只是在框架生成的错误出现时传递给我,因为我不太确定我会处理所有代码并将所有用户信息转换成更具体的项目。框架可以更改和添加更多代码,或者更改现有代码的含义等。它还可以帮助我更具体地确定错误的来源。例如,如果我的 StackKit 框架在中生成错误 com.stackkit 域,我知道这是一个框架问题。但是,如果它在 NSURLErrorDomain ,然后我知道它具体来自于URL加载机制。

    你什么 能够 要做的是捕获框架生成的错误,并将其包装到一个新的错误对象中,该对象包含您的域和一个通用代码,类似于 kFrameworkErrorCodeUnknown 或者什么,然后将捕获的错误放入 userInfo NSUnderlyingErrorKey . coredata做了很多事情(例如,如果你尝试 save: NSManagedObjectContext ,但是您有关系完整性错误,您将得到一个返回的错误,但是 保险公司 将包含更多的信息,例如具体哪些关系是错误的等)。

        2
  •  35
  •   Connor    10 年前

    我没有足够的代表来评论,但是对于Dave Delong接受的答案,使用它可能会稍微好一点。 [[NSBundle mainBundle] bundleIdentifier] 而不是 @"com.myName.myProject" . 这样,如果您更改您的名称或项目的名称,它将被准确地反映出来。

        3
  •  3
  •   Mike Zriel    6 年前

    如何创建自定义nserrror:

    首先创建错误消息的字典

    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];
    

    然后将用户信息分配给nsdictionary并完成。