一、Foundation框架—错误接收与异常处理
我们都知道程序在运行过程中难免会出现各种错误和特殊问题,这个时候就需要我们使用接受错误(error)和捕获异常(Exception)。
1. 错误接收:
1). 在C语言中常常会通过函数返回值来表示错误信息,但是返回值仅仅是一个整型值或者一个字符串,有时候难以表达详细准确的错误信息。oc中可以使用NSError类对象来发送运行时错误信息,然后以某种方式通知用户。。。
我们可以通过下面的规则来传递错误信息:
1). 使用方法的返回值来表明方法调用是否成功。如:返回值为BOOL类型,NO表示失败;返回值为id类型,nil表示失败;
2). 有些方法最后一个参数的类型为NSError**,如果方法返回后该指针非空(不是NULL),则说明方法出错。该方法会在其方法体中创建一个自动释放的NSError对象,并通过该指针返回给调用方。
void stringExport() {
NSString *str = @"1234995789我们是";
NSString *path = @"/Users/shumei/Desktop/test.txt";
NSError *error;
[str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) { // 返回的值不为空,也就是真
NSLog(@"写入失败:%@", error);
} else {
NSLog(@"写入成功");
}
}
实例2:
void book() {
// 异常机制
// NSError *error = nil;
// 下面的效果等同上面
NSError *error;
NSURL *myUrl = [NSURL URLWithString:@"http://qwerastdf.com.cn"];
// 从url中生成字符串
NSString *str = [NSString stringWithContentsOfURL:myUrl encoding:NSUTF8StringEncoding error:&error];
NSLog(@"Str = %@", str);
if (error) { // 或者是 str == nil
NSLog(@"Domain: %@, Code: %ld", [error domain], [error code]);
NSDictionary *dic = [error userInfo];
NSLog(@"user info dictionary: %@", [dic description]);
} else {
NSLog(@"haha");
}
}
2. 异常处理
大部分变成语言都支持异常处理。OC中也是一样,当出现异常时候,代码会生成异常类NSException对象,将异常的各种信息存入该对象中,然后将其抛出。异常抛出后,他会一直沿用调用栈堆的顶端(调用端)抛出,知道该异常被捕获。异常被捕获处理完毕后,程序继续执行。如果异常在向上抛出的过程中,没有任何代码能够捕获并处理异常,则程序退出。
异常处理代码结构:
@try {
// Code that can potentially throw an exception
// 异常处理域,编写可能出现异常的代码
}
@catch (AppCustomException *e) {
// 处理AppCustomException类型异常的代码
}
@catch (NSException *exception) {
// Handle an exception thrown in the @try block
// 处理NSException 类型异常处理的代码
// 如果希望重新抛出异常,则可以使用这个指令
// @throw expression;
}
// 此部分是非强制的
@finally {
// Code that gets executed whether or not an exception is thrown
// 无论怎样(发生或者不发生异常)都要执行的代码
}
抛出异常的方式有两种,一种是通过@throw指令,另一种是调用NSException类的实例方法raise。@throw指令可以抛出任何对象,而raise方法只适用于NSException类及其子类的对象。这两种方式效果是一样的。