2010-07-18 59 views
99

有關於爲你自己的框架設置錯誤域的previous SO post,但是關於爲你自己的項目設置錯誤域和自定義錯誤代碼的最佳實踐是什麼/ app最佳實踐 - 你自己的項目/應用程序的NSError域和代碼

例如,假設您正在開發一個具有大量驗證的核心數據密集型應用程序,那麼您應該堅持使用「現成的」核心數據錯誤代碼(如NSManagedObjectValidationErrorCoreDataErrors.h),或者應該創建自己MyAppErrors.h並定義錯誤更明確(即MyAppValidationErrorInvalidCombinationOfLimbs

創建自定義錯誤域,並設置錯誤代碼可能顯著歧義你的代碼,但它是太多的開銷,以保持和沒有一個擔心錯誤代碼編號有衝突嗎?或者這裏還有其他問題嗎?

回答

141

我個人使用rever se-DNS風格的域名。例如:

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

域(@"myproject")的第三部分只是用於區分在另一個項目("My Other Project" =>com.davedelong.myotherproject)從錯誤這個項目("My Project")中的錯誤。

這是一個簡單的方法,以確保我不會用別人的錯誤域衝突(如果我使用第三方代碼),除非開發商故意想惹只是我(我相信會不太可能......)。

至於代碼編號衝突,不要擔心。只要代碼在域內是唯一的,你應該沒問題。

至於翻譯錯誤,這取決於你。無論你做什麼,都要確保你記錄得很好。 個人問題,我通常會在他們找到我時傳遞框架生成的錯誤,因爲我從來不確定是否會處理所有代碼並將所有userInfo轉換爲更具體的項目。這些框架可以改變和添加更多的代碼,或者改變現有代碼的含義等。它還幫助我更具體地確定錯誤來自哪裏。例如,如果我的StackKit框架在com.stackkit域中產生錯誤,我知道這是一個框架問題。但是,如果它在NSURLErrorDomain中生成錯誤,那麼我知道它特別來自URL加載機制。

什麼你可能要做的就是捕捉框架產生的錯誤,並在具有您的域名和通用代碼,像kFrameworkErrorCodeUnknown什麼新的錯誤對象包裝它,然後將捕獲的錯誤在userInfoNSUnderlyingErrorKey。 CoreData可以做很多事情(例如,如果你嘗試使用​​和NSManagedObjectContext,但你有關係完整性錯誤,你會得到一個錯誤,但是NSUnderlyingErrorKey將包含更多的信息,比如具體哪些關係是錯誤的,等等)。

+0

由於蘋果也使用反向DNS,因此其他人也可以使用這種風格。 – 2015-01-15 07:52:36

+0

鏈接到StackKit框架(stackkit.com)已經死亡。 – Pang 2015-08-09 06:19:52

28

我沒有足夠的代表發表評論,但對於Dave DeLong接受的答案,使用[[NSBundle mainBundle] bundleIdentifier]而不是@"com.myName.myProject"可能會稍微好一些。這樣,如果你改變你的名字或者項目名字,它會被準確地反映出來。

+4

好主意。如果你使用的是Swift,你應該使用解包後的可選項:'NSBundle.mainBundle()。bundleIdentifier!'(如果你知道bundle標識符已設置,我想最有可能) – Juul 2015-01-29 12:09:13

+0

爲什麼你想反映項目錯誤域中的名稱更改? – zrxq 2015-02-01 14:51:10

+1

@zrxq肯定有不同的錯誤領域有價值,但想象你拼錯了你的項目,或者你改變了你的名字,希望它反映到任何地方。最好是動態設置而不是硬編碼。 – Connor 2015-02-04 17:22:20