前言
任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃。良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性。
本文的Swift版本:Swift 3
Objective C
返回nil
如果出错了,就返回空是Objective C中的一种常见的处理方式。因为在Objective C中,向nil发送消息是安全的。比如:
- (instancetype)init
{
self = [super init];
if (self) {
}
//如果初始化失败,会返回nil
return self;
}
断言
断言指定了我们方法的上下文,如果断言不满足,则在Debug环境下会直接crash。
比如:AFNetworking中的af_resume方法
- (void)af_resume {
NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state");
NSURLSessionTaskState state = [self state];
[self af_resume];
if (state != NSURLSessionTaskStateRunning) {
[[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self];
}
}
返回状态码
返回状态码和全局错误信息往往是在一起使用的。这种错误的处理方式常见于用Objective C来封装C的代码,或者纯C的方法。比如sqlite中的错误处理:
int result = sqlite3_open(dbPath,&_db );
if(result != SQLITE_OK) {
//如果出错
}
又比如,Data写入到文件
BOOL succeed = [currentData writeToFile:path atomically:YES];
NSError
NSError是Cocoa中推荐的错误处理方式。
使用NSError来处理错误的例子遍布整个CocoaTouch框架。
比如:NSFileManager
NSFileManager * fm = [NSFileManager defaultManager];
NSError * error;
[fm removeItemAtPath:path error:&error];
又比如,NSURLSession通过NSError来传递错误信息
[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
一个NSError包括了错误的详细信息:主要有以下几个信息
- code 错误的状态码
- domain 错误的域
- userInfo 错误的详细信息
比如,常见的NSURLErrorDomain,也就是网络请求失败:
NSURLErrorCancelled = -999,
NSURLErrorBadURL = -1000,
NSURLErrorTim