แนวทางปฏิบัติที่ดีที่สุด - โดเมนและรหัส NSError สำหรับโครงการ / แอปของคุณเอง


114

มีโพสต์ SO ก่อนหน้านี้เกี่ยวกับการตั้งค่าโดเมนข้อผิดพลาดสำหรับเฟรมเวิร์กของคุณเอง แต่แนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการตั้งค่าโดเมนข้อผิดพลาดและรหัสข้อผิดพลาดที่กำหนดเองสำหรับโครงการ / แอปของคุณเองคืออะไร?

ตัวอย่างเช่นสมมติว่าคุณกำลังทำงานในแอปที่เน้นข้อมูลหลักซึ่งมีการตรวจสอบความถูกต้องจำนวนมากคุณควรยึดติดกับรหัสข้อผิดพลาดข้อมูลหลัก "นอกชั้นวาง" (เช่นNSManagedObjectValidationErrorจากCoreDataErrors.h) หรือควรสร้างขึ้นเองMyAppErrors.hและกำหนดข้อผิดพลาดด้วย ความเฉพาะเจาะจงมากขึ้น (เช่นMyAppValidationErrorInvalidCombinationOfLimbs?

การสร้างโดเมนข้อผิดพลาดที่กำหนดเองและชุดรหัสข้อผิดพลาดอาจทำให้รหัสของคุณไม่ชัดเจน แต่มีค่าใช้จ่ายมากเกินไปที่จะรักษาและต้องกังวลเกี่ยวกับความขัดแย้งในการกำหนดหมายเลขรหัสข้อผิดพลาดหรือไม่ หรือมีข้อกังวลอื่น ๆ ที่นี่?

คำตอบ:


152

โดยส่วนตัวแล้วฉันใช้โดเมนแบบ reverse-DNS ตัวอย่างเช่น:

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

ส่วนที่สามของโดเมน ( @"myproject") ใช้เพื่อแยกความแตกต่างของข้อผิดพลาดจากโปรเจ็กต์นี้ ( "My Project") จากข้อผิดพลาดในโปรเจ็กต์อื่น ( "My Other Project"=> com.davedelong.myotherproject)

เป็นวิธีง่ายๆในการตรวจสอบให้แน่ใจว่าฉันจะไม่ขัดแย้งกับโดเมนข้อผิดพลาดของใครอื่น (ถ้าฉันใช้รหัสของบุคคลที่สาม) เว้นแต่ว่านักพัฒนาจะตั้งใจที่จะยุ่งกับฉันเพียงคนเดียว (ซึ่งฉันเชื่อว่าไม่น่าเป็นไปได้สูง .. )

สำหรับความขัดแย้งในการกำหนดหมายเลขรหัสไม่ต้องกังวลเรื่องนั้น ตราบใดที่รหัสไม่ซ้ำกันภายในโดเมนคุณก็จะโอเค

ส่วนข้อผิดพลาดในการแปลนั้นขึ้นอยู่กับคุณ ไม่ว่าคุณจะทำอะไรก็ตามอย่าลืมจัดทำเอกสารให้ดี โดยส่วนตัวแล้วฉันมักจะส่งต่อข้อผิดพลาดที่สร้างเฟรมเวิร์กตามที่พวกเขามาถึงฉันเนื่องจากฉันไม่แน่ใจเลยว่าฉันจะจัดการรหัสทั้งหมดและแปล userInfo ทั้งหมดให้เป็นสิ่งที่เฉพาะเจาะจงมากขึ้นสำหรับโครงการของฉัน เฟรมเวิร์กสามารถเปลี่ยนแปลงและเพิ่มโค้ดได้มากขึ้นหรือเปลี่ยนความหมายของโค้ดที่มีอยู่เป็นต้นนอกจากนี้ยังช่วยให้ฉันระบุได้ชัดเจนขึ้นว่าข้อผิดพลาดมาจากไหน ตัวอย่างเช่นถ้าเฟรมเวิร์กStackKitของฉันสร้างข้อผิดพลาดในcom.stackkitโดเมนฉันรู้ว่ามันเป็นปัญหาของเฟรมเวิร์ก อย่างไรก็ตามหากเกิดข้อผิดพลาดขึ้นNSURLErrorDomainฉันก็รู้ว่ามันมาจากกลไกการโหลด URL โดยเฉพาะ

สิ่งที่คุณจะทำคือการจับข้อผิดพลาดที่สร้างกรอบและห่อไว้ในวัตถุข้อผิดพลาดใหม่ที่มีประสิทธิภาพและรหัสทั่วไปของคุณสิ่งที่ชอบkFrameworkErrorCodeUnknownหรือสิ่งที่แล้ววางข้อผิดพลาดถูกจับในภายใต้userInfo NSUnderlyingErrorKeyCoreData ไม่นี้มาก (ตัวอย่างเช่นถ้าคุณพยายามที่จะแต่คุณมีข้อผิดพลาดความสมบูรณ์ของความสัมพันธ์ของคุณจะได้รับกลับข้อผิดพลาดเพียงครั้งเดียว แต่จะมีข้อมูลมากขึ้นเช่นเฉพาะซึ่งความสัมพันธ์ที่ผิด ฯลฯ )save:NSManagedObjectContextNSUnderlyingErrorKey


เนื่องจากแอปเปิลยังใช้ DNS ย้อนกลับดูเหมือนว่าผู้อื่นจะใช้ลักษณะนี้เช่นกัน
Johan Karlsson

36

ฉันไม่ได้มีตัวแทนพอที่จะแสดงความคิดเห็น แต่สำหรับคำตอบที่ได้รับการยอมรับโดย Dave DeLong มันอาจจะดีขึ้นเล็กน้อยที่จะใช้แทน[[NSBundle mainBundle] bundleIdentifier] @"com.myName.myProject"ด้วยวิธีนี้หากคุณเปลี่ยนชื่อหรือชื่อโครงการของคุณจะมีผลอย่างถูกต้อง


4
ความคิดที่ดี. หากคุณใช้ Swift คุณควรใช้ตัวเลือกที่ไม่ได้ติดตั้ง: NSBundle.mainBundle().bundleIdentifier!(หากคุณทราบว่ามีการตั้งค่าตัวระบุชุดซึ่งฉันเดาว่าน่าจะเป็นไปได้มากที่สุด)
Juul

เหตุใดคุณจึงต้องการแสดงการเปลี่ยนแปลงชื่อโครงการในโดเมนข้อผิดพลาด
zrslv

1
@zrxq มีค่าในการมีโดเมนข้อผิดพลาดที่แตกต่างกันอย่างแน่นอน แต่ลองนึกดูว่าคุณสะกดผิดโครงการของคุณหรือคุณเปลี่ยนชื่อของคุณโดยที่ต้องการให้มันปรากฏทุกที่ ควรตั้งค่าแบบไดนามิกดีกว่าการเข้ารหัสแบบแข็ง
Connor

1
@vare นั้นชัดเจนมากฉันไม่เข้าใจจริงๆว่าจะให้ประโยชน์ในทางปฏิบัติอะไรบ้าง ความเข้าใจของฉันคือตัวระบุเหล่านั้นจำเป็นต้องไม่ซ้ำกันในบริบทของแอปนั่นคือทั้งหมดที่ โอเคบางทีคุณแค่อยากให้พวกเขามีความสวยงามมากขึ้นฉันเข้าใจแล้ว!
zrslv

1
ใช่คุณนำเสนอประเด็นที่ดี มีหลายครั้งที่คุณต้องการให้โดเมนไม่ซ้ำกันฉันจะถือว่า ... ตัวอย่างเช่นถ้าคุณสร้าง SDK หรือ (โกโก้) Pod คุณต้องการให้โดเมนข้อผิดพลาดของคุณสะท้อนว่ามาจากที่ใดไม่ใช่ของโครงการ ชื่อ. แก้ไข: ฉัน (ในคำตอบของฉัน) ต้องการที่จะชี้ให้เห็นว่า @ "com.myName.myProject" เหมือนกันกับ bundleIdentifier ในกรณีนี้ซึ่งผู้คนอาจไม่ทราบ
Connor

4

วิธีสร้าง 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 และทำเสร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.