NSError分析
在iOS开发中,NSError的使用非常常见,使用也比较简单,也正因为简单,所以对这一部分知识不甚注重。但是近期在做app底层网络封装时发现了一些问题。我使用的网络框架是AFNetworking,AFNetworking常常会返回一些错误信息,有时需要将这些错误信息告诉用户,通常做法是将error.localizedDescription以弹框的形式原原本本展现给用户(譬如“网络不畅”之类的),但是这样非常不友好,一是这些信息往往是英文,二是这些信息过于冗长,不够简洁。所以自然想到了对这些error信息进行包装。这就迫使我不得不去了解更多关于NSError相关的信息,本文着重叙述Error Domain和Error Code。
Error Domain
首先,error domain是一个字符串。因为历史原因,在OS X中将errors分为不同的domains。譬如,对于Carbon框架的Error,归于OSStatus domain(NSOSStatusErrorDomain),对于POSIX error,归于NSPOSIXErrorDomain,而对于我们的iOS开发,一般使用NSCocoaErrorDomain。NSError.h定义了四个domain,如下:
// Predefined domain for errors from most AppKit and Foundation APIs.
FOUNDATION_EXPORT NSString *const NSCocoaErrorDomain; // Other predefined domains; value of "code" will correspond to preexisting values in these domains.
FOUNDATION_EXPORT NSString *const NSPOSIXErrorDomain;
FOUNDATION_EXPORT NSString *const NSOSStatusErrorDomain;
FOUNDATION_EXPORT NSString *const NSMachErrorDomain;
除了上述的四个domain之外,不同的framework甚至一些classes group(相关的几个classes)也定义了自己的domain,譬如对于Web Kit framework,定义了WebKitErrorDomain,而更常见的,URL相关的classes定义了NSURLErrorDomain。
Domains非常有用,特别当程序非常复杂庞大时,官方文档是这么说的:
Domains serve several useful purposes. They give Cocoa programs a way to identify the OS X subsystem that is detecting an error. They also help to prevent collisions between error codes from different subsystems with the same numeric value. In addition, domains allow for a causal relationship between error codes based on the layering of subsystems; for example, an error in the NSOSStatusErrorDomain may have an underlying error in the NSMachErrorDomain.
用户也可以为自己的framework或者app定义自己的domain,官方推荐的domain命名是:com.company.framework_or_app .ErrorDomain
Error Code
Error Code的类型是signed integer。Error Code指定了特殊的错误。这个信息对于程序开发来说极为有用。比如访问URL资源timeout错误对应的是NSURLErrorTimedOut(-1001)。
那么如何知道各个error code对应什么样的值呢?iOS开发中常用的error code所对应的头文件如下:
Foundation/FoundationErrors.h
- Generic Foundation error codesCoreData/CoreDataErrors.h
- Core Data error codesFoundation/NSURLError.h
- URL error codes
以Foundation/NSURLError.h为例,其中的URLError Code值从NSURLErrorDataLengthExceedsMaximum到NSURLErrorCancelled,二者分别对应-1103和-999。如果对所有网络error笼统处理,这两个值可以为我所用。
The User Info Dictionary
Every NSError object has a “user info” dictionary to hold error information beyond domain and code.
user info
可以包含很多自定义信息,最常用的或许是localized error information
。访问localized error information
有两种方式,其一是访问error的localizedDescription属性,其二是访问error.userInfo的NSLocalizedDescriptionKey域。
关于user info dictionary,比较常见,这里不多讲了,更多内容参考:
《Error Handling Programming Guide》
最新文章
- MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决
- C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)
- secureCRT中文乱码问题
- GitHub Desktop 桌面工具,离线版本下载(无需考虑网络问题)
- 挖Linux中的古老缩略语
- input上传图片 显示预览信息
- (转载)Htmlparser Filter 简要归纳
- 0c-41-ARC使用特点及注意事项
- 笔记-iOS 视图控制器转场详解(上)
- Android(java)学习笔记118:类继承的注意事项
- 自己写的Ext树,Ext3.4,静态全部加载
- java获得指定日期的前一天,后一天的代码
- linux之线程
- linux命令-sed,uniq,cut,wc
- 搭建ftp服务器实现文件共享
- Java的基本数据类型和运算
- 每天学一点Docker(5)——了解Docker架构
- day14,函数的使用方法:生成器表达式,生成器函数
- Intellij IDEA中maven更新不下来pom中的jar包,reimport失效
- Kali Linux 初始化配置:Apache2 /SSH /FTP
热门文章
- OC-为何用copy修饰block
- npm start 修改启动端口的不同方式
- luogu P3512 [POI2010]PIL-Pilots
- 使用wget进行整站下载(转)
- iOS开发 清除电话号码中的其他符号
- css 滤镜之AlphaImageLoader
- 心情日记app总结 数据存储+服务+广播+listview+布局+fragment+intent+imagebutton+tabactivity+美工
- 教你如何在MySql中导入大小超过2M的数据库文件
- java中类加载顺序(深入Java)
- mysql使用“.frm”文件恢复表结构