您的位置:首页 > 其它

NSError

2016-07-22 00:00 253 查看
摘要: NSError是什么 怎么用

————————————转载自麦芒实验室——————————————

NSError是系统提供的错误类,继承于NSObject,用于获取系统错误或者自定义错误。

它不同于NSException,异常未捕获则会导致程序崩溃。NSError只是返回一个错误信息,对外部调用者来说可以随意处理这个错误,仅仅是告诉调用者这个方法发生了错误而已。

NSError对象封装了更为丰富、更易扩展的错误信息。你可以只是用错误代码或者错误描述信息。NSError对象的核心属性是错误域(Domain——NSString类型),一个错误域(Domain)特定的错误代码(code)和用户信息(userInfo)都包含在特定的应用程序信息中。

NSError不是一个抽象类,可以直接使用它。还可以创建它的子类,并且重载localizedDescription方法来提供更好滴本地化错误描述信息。

如何使用?

创建对象

- (instancetype)initWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict NS_DESIGNATED_INITIALIZER;

(instancetype)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict;

获得属性

NSInteger _code; //错误码

NSString *_domain; //必须为nil

NSDictionary *_userInfo; // 可以为nil

预定义域

AppKit和Foundation库中主要的错误域

NSString *const NSCocoaErrorDomain;

其他域

NSString *const NSPOSIXErrorDomain;

NSString *const NSOSStatusErrorDomain;

NSString *const NSMachErrorDomain;

获取本地错误描述

@property (readonly, copy) NSString *localizedDescription;

@property (readonly, copy) NSString *localizedFailureReason;

@property (readonly, copy) NSString *localizedRecoverySuggestion;

@property (readonly, copy) NSArray *localizedRecoveryOptions;

预定义错误Key

/ Key in userInfo. A recommended standard way to embed NSErrors from underlying calls. The value of this key should be an NSError.

FOUNDATION_EXPORT NSString *const NSUnderlyingErrorKey;

// Keys in userInfo, for subsystems wishing to provide their error messages up-front.

FOUNDATION_EXPORT NSString *const NSLocalizedDescriptionKey; // NSString

FOUNDATION_EXPORT NSString *const NSLocalizedFailureReasonErrorKey ; // NSString

FOUNDATION_EXPORT NSString *const NSLocalizedRecoverySuggestionErrorKey; // NSString

FOUNDATION_EXPORT NSString *const NSLocalizedRecoveryOptionsErrorKey ; // NSArray of NSStrings

FOUNDATION_EXPORT NSString *const NSRecoveryAttempterErrorKey; // Instance of a subclass of NSObject that conforms to the NSErrorRecoveryAttempting informal protocol

FOUNDATION_EXPORT NSString *const NSHelpAnchorErrorKey ; // NSString containing a help anchor

// Other standard keys in userInfo, for various error codes

FOUNDATION_EXPORT NSString *const NSStringEncodingErrorKey ; // NSNumber containing NSStringEncoding

FOUNDATION_EXPORT NSString *const NSURLErrorKey ; // NSURL

FOUNDATION_EXPORT NSString *const NSFilePathErrorKey ; // NSS
3ff0
tring

代码示例:

NSString *fileName = @"fileName";

NSError *error = nil;

NSString *string = [[NSString alloc] initWithContentsOfFile:fileName

encoding:NSUTF8StringEncoding

error:&error];

if (error) {

NSLog(@"%@",error.localizedDescription);

}else{

NSLog(@"no error");

}

输出内容:

The file “fileName” couldn’t be opened because there is no such file.

NSDictionary *userInfo = @{NSLocalizedDescriptionKey:@"my custom error desc"};

—————————————————————————————————————————

使用自定义错误

- (void)myError:(NSError **)error

{

NSDictionary *userInfo = @{NSLocalizedDescriptionKey:@"my custom error desc"};

*error = [NSError errorWithDomain:MyCustomErrorDomain code:MyCustomErrorCodeTimeout userInfo:userInfo];

}

这样调用:

[self myError:&error];

if (error) {

NSLog(@"error is %@",error.localizedDescription);

}else{

NSLog(@"no error");

}

—————————————————————————————————————————

在NFNetworking中,有这样的方法

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager POST:URLString parameters:newParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

//失败回调中有NSError的应用,不同的错误信息均通过NSError返回。

}];

其实像我们在编写公用类或框架的时候也应该采用该种方式,将内部不同的错误信息均通过NSError对象返回上层调用者,上层调用者可根据不同的error code进行不同的提示。

NSError的好处、优势

通过NSError在软件组件间传递错误信息。相比简单的错误代码来说,使用NSError的主要优势在于NSError对象包含了错误域属性。

NSError对象的使用并不限于操作系统。就像上面提到的,我们还可以创建自己的NSError对象,使用它们在应用内传递错误消息。

域属性根据产生错误代码的库或框架对这些错误代码进行隔离。借助域,框架开发者无须担心覆盖错误代码,因为域属性定义了产生错误的框架。比如,框架 A 与B 都会产生错误代码1,不过这两个错误代码会被每个框架提供的唯一域值进行区分。因此,如果代码需要区分NSError 值,就必须对NSError 对象的code 与domain 属性进行比较。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: