Objective-C学习之错误处理

By | 2014/04/20

错误处理

几乎每一个app在开发过程中都会遇到错误,一些错误是在程序员的控制之外例如磁盘空间不足或网络连接失败。还有一些错误是可以预料到的,例如用户的非法输入。尽管每一个开发者都力图让程序完美,但是有时候程序还是会发生错误。

如果你还学过其他的编程语言那么你应该习惯了用异常来处理大部分的错误,但是在OC中异常仅仅用来提示程序员在编程时犯得错误例如数组越界,非法访问方法等。这些错误通常时开发者在调试的时候就应该更正的。

除了上述的错误外的所有错误都可以使用一个NSError的实例来表示。在本片博客中将简单介绍一下错误处理。跟多信息参见 Error Handling Programming Guide

 使用NSError来处理错误

错误在程序中往往是不可避免的。如果你需要从远程web服务请求数据那么将会有大量潜在的问题例如:

1.网络无法连接。

2.远程web服务不可访问。

3.远程web服务对你的请求拒绝服务。

4.获得到的数据不是你想要的。

悲剧的是开发者根本不可能针对每一种错误来预先设计好备案,相反在你计划中的错误你必须处理好他。

有些delegate方法会警告你可能会产生错误

例如NSURLConnectionDelegate protocol包含一个connection:didFailWithError这么一个方法:

– (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

如果错误发生了那么这个delegate方法将会被调用,接下来提供给你一个NSError对象,该对象主要是用来描述该错误的。

NSError对象中包括一个错误处理码、域以及描述。Cocoa、Cocoa Touch中的错误是按照域来划分的。如果一个错误在NSURLConnection中发生那么connection:didFailWithError:方法将会从NSURLErrorDomain中提供一个错误。该错误对象中提供了关于该错误的具体描述如:“A server with the specified hostname could not be found.”

一些方法可以传递错误引用

Cocoa和Cocoa Touch可以通过引用来处理错误。例如:

– (BOOL)writeToURL:(NSURL *)aURL
options:(NSDataWritingOptions)mask
error:(NSError **)errorPtr;

你可以向下面的方式来调用该函数:

NSError *anyError;
BOOL success = [receivedData writeToURL:someLocalFileURL
options:0
error:&anyError];
if (!success) {
NSLog(@”Write failed with error: %@”, anyError);
// present error to user
}

如果错误发生那么writeToURL:……方法将会返回NO,然后更新anyError指针来指向一个描述该错误的error对象。

当使用传递引用来处理错时,就得使用方法的返回值来判断一个错误是否发生(例如上面例子中的),当不想处理该错误时可以向相关方法传递一个NULL值。

自定义错误

为了能够创建你的NSError对象,你需要定义你自己的错误域,形式如下:

com.companyName.appOrFrameworkName.ErrorDomain。

接下来你还需要选取一个不同的错误代码,以及针对这些错误代码建立合适的错误描述:

NSString *domain = @”com.MyCompany.MyApplication.ErrorDomain”;
NSString *desc = NSLocalizedString(@”Unable to…”, @””);
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };

NSError *error = [NSError errorWithDomain:domain
code:-101
userInfo:userInfo];

如果你需要传回错误对象的引用你需要这样声明你的方法:

– (BOOL)doSomethingThatMayGenerateAnError:(NSError **)errorPtr;

如果在你的方法中发生了错误那么你需要检查一下传进来的errorPtr是不是NULL

– (BOOL)doSomethingThatMayGenerateAnError:(NSError **)errorPtr {

// error occurred
if (errorPtr) {
*errorPtr = [NSError errorWithDomain:…
code:…
userInfo:…];
}
return NO;
}

Exceptions

OC的Exception的语法非常像java和C++的。语法如下:

@try {
// do something that might throw an exception
}
@catch (NSException *exception) {
// deal with the exception
}
@finally {
// optional block of clean-up code
// executed whether or not an exception occurred
}

Exception通常用来处理数组越界等类似的问题。详细参考Exception Programming Topics.

 

 

One thought on “Objective-C学习之错误处理

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.