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对象,使用它们在应用内传递错误消息。
域属性根据产生错误代码的库或框架对这些错误代码进行隔离。借助域,框架开发者无须担心覆盖错误代码,因为域属性定义了产生错误的框架。比如,框架 A 与B 都会产生错误代码1,不过这两个错误代码会被每个框架提供的唯一域值进行区分。因此,如果代码需要区分NSError 值,就必须对NSError 对象的code 与domain 属性进行比较。
————————————转载自麦芒实验室——————————————
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 属性进行比较。
相关文章推荐
- 第二章 Java基础程序设计
- 程序员必须记住的几句话
- 程序员必须记住的几句话
- Font Awesome图标安装及使用方法
- 计算机基础
- LeetCode - 292. Nim Game
- Celery源码分析
- 编译安装Ruby2.3.1
- 判断多线程是否执行完成
- jquery $.trim()方法使用介绍
- Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义? | WEB前端开发
- MySQL 数据类型
- 12个JavaScript技巧
- java④
- 人人须知的 jQuery 技巧
- 小白javascript做考试页(一)
- eclipse 中 svn 插件的使用
- samba的从无到有
- 【MarkDown】Markdown语法
- php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法