文档章节

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

 

 

 

 

 

 

 

本文转载自:

共有 人打赏支持
风吹筝
粉丝 0
博文 5
码字总数 1593
作品 0
杭州

暂无文章

深入理解OAuth2.0协议

1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。豪车一般配备两种钥匙:主钥匙和泊...

xtof
15分钟前
0
0
Linux学习-0920

3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令 一、usermode命令 usermode作用是用来修改用户信息。 方法: usermod 参数 username 示例1:修改用户uid usermod -u 1010 test5 示例2...

wxy丶
25分钟前
0
0
synchronized锁对象的坑

今天本来写点其他东西,碰巧写了一下synchronized,没想到掉坑里面了,大佬别笑。 起初代码大概是这样的: package com.ripplechan.part_1_2_3;import java.util.concurrent.CountDownL...

RippleChan
28分钟前
0
0
XAMPP环境搭建(Apache + MariaDB + PHP + Perl)

operation system:ubuntu-18.04.1 step1:download XAMPP #sudo wget https://www.apachefriends.org/xampp-files/7.2.9/xampp-linux-x64-7.2.9-0-installer.run step2:install XAMPP #sudo ......

硅谷课堂
31分钟前
0
0
关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用

目的是为OSG做自定义的导出插件. 记录取得数据的方法. Max在代码中会提供一个INode对象. 从这个对象里取出各种数据. getSkin这个函数取出了ISkin修改器 下面这个函数一样是用于学习, 把数据输...

洛克人杰洛
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部