Nếu bạn có một số tiền khổng lồ của việc xây dựng lỗi, cuộc sống của bạn có thể đơn giản hơn nhiều bằng cách sử dụng một lớp học. Tôi thực sự sử dụng C++ cho điều này nên các cuộc gọi một chương trình không cần có thể được gỡ bỏ (không giống như objc), nhưng bạn có thể sử dụng C, ObjC, hoặc C++ cho việc này:
MONErrorDomain.h
// you won't normally need an instance here
@interface MONErrorDomain : NSObject
+ (NSString *)domain; // << required override
- (NSString *)domain; // << returns [[self class] domain]
// example convenience methods:
// uses [self domain]
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode; // << user info would be nil
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode userInfo:(NSDictionary *)userInfo;
@end
MONKoalaError.h
@interface MONKoalaError : MONErrorDomain
+ (NSError *)outOfEucalyptus;
@end
extern NSString * const MONKoalaErrorDomain;
typedef enum MONKoalaErrorCode {
MONKoalaErrorCode_Undefined = 0,
MONKoalaErrorCode_OutOfEucalyptus
} MONKoalaErrorCode;
MONKoalaError.m
// apple recommends we use reverse domains
NSString * const MONKoalaErrorDomain = @"com.mon.koala-library.MONKoalaErrorDomain";
@implementation MONKoalaError
+ (NSString *)domain
{
return MONKoalaErrorDomain;
}
+ (NSError *)outOfEucalyptus
{
NSDictionary * info = …;
return [self errorWithErrorCode:MONKoalaErrorCode_OutOfEucalyptus userInfo:info];
}
@end
Sau đó, việc tạo ra lỗi là tất cả ở một nơi cho từng lĩnh vực, và các khách hàng có thể dễ dàng nhận lỗi của họ mà không thực sự xây dựng chúng bằng tay:
if (outError) {
*outError = [MONKoalaError outOfEucalyptus];
}
và xử lý lỗi có dạng:
if ([e.domain isEqualToString:MONKoalaErrorDomain]) {
switch (e.code) {
case MONKoalaErrorCode_OutOfEucalyptus : {
self.needsEucalyptus = true;
…
Chỉ cần một bình luận nhỏ: trong khi một mã lỗi NSError không nên bị nhầm lẫn bởi mã thoát chương trình, tôi thấy nó truy cập trực quan để có một mã lỗi bằng 0. Tôi thích có -1 cho một lỗi không xác định. – Alerty
@Alerty '0' được sử dụng cho không xác định vì đó là giá trị dễ đoán trước hơn khi lập trình viên đưa ra lỗi logic (ví dụ: thư' nil' hoặc sử dụng bộ nhớ khởi tạo mặc định trong gỡ lỗi). đó là để nói, lỗi sẽ không bao giờ trả về 'MONKoalaErrorCode_Undefined' nếu nó thực sự là một lỗi của' MONKoalaErrorCode'. – justin