文档章节

NSError

风吹筝
 风吹筝
发布于 2016/07/22 15:41
字数 917
阅读 10
收藏 0

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

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   ;  // NSString

代码示例:

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 属性进行比较。

 

 

 

 

 

 

 

本文转载自:

共有 人打赏支持
上一篇: HTTP
下一篇: 单例类怎么写
风吹筝
粉丝 0
博文 5
码字总数 1593
作品 0
杭州
私信 提问

暂无文章

全屋WiFi彻底无死角 这才是终极解决方案

无线网络现在不仅在家庭中不可或缺,在酒店、医院、学校等场景中的需求也越来越多。尤其是这些场景中,房间多但也需要每个房间都能够完美覆盖WiFi,传统的吸顶式AP就无法很好的解决问题。 H3...

linux-tao
12分钟前
0
0
Python日期字符串比较

需要用python的脚本来快速检测一个文件内的二个时间日期字符串的大小,其实实现很简单,首先一些基础的日期格式化知识如下 复制代码 %a星期的简写。如 星期三为Web %A星期的全写。如 星期三为...

dragon_tech
12分钟前
0
0
ORA 各种oraclesql错误

ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某...

青峰Jun19er
16分钟前
2
0
没错,老板让我写个 BUG!

前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了🙄。 先来看看具体是要干啥吧,其实主要就是...

crossoverJie
29分钟前
4
0
开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部