Objective-C中使用@try处理异常

来源:互联网 发布:家庭装修网络布置方案 编辑:程序博客网 时间:2024/04/29 23:36

在我们编写Objective-C程序时,最好的编程实践是指能预测程序中可能出现的问题。为此,你可以测试使程序异常终止的条件并处理这些情况, 可能要记录一条消息并完全终止程序,或者采取其他正确措施。以避免错误为例,在程序运行时执行测试可以避免向对象发送未识别的消息。当试图发送这类未识别 消息时,程序通常会立即终止并抛出一个异常。

看看下面的代码,Fraction类中未定义任何名为noSuchMethod的方法。当你编译程序时,就会得到相关警告消息。










#import “Fraction.h”
int main (int argc, char *argv [])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *f = [[Fraction alloc] init];
[f noSuchMethod];
NSLog (@”Execution continues!”);
[f release];
[pool drain];
return 0;
}
你可以不管警告消息继续运行程序。如果这样做,程序可能会异常终止,并出现类似如下的错误:
 
-[Fraction noSuchMethod]: unrecognized selector sent to instance 0x103280
*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’,
reason: ‘*** -[Fraction noSuchMethod]: unrecognized selector sent
to instance 0x103280’
Stack: (
2482717003,
2498756859,
2482746186,
2482739532,
2482739730
)
Trace/BPT trap
为了避免在这类情况下程序异常终止,可以在一个特殊的语句块中加入一条或多条语句,格式如下:
 
@try {
statement
statement
...
}
@catch (NSException *exception) {
statement
statement
...
}
在@try块中加入这些statement后,程序正常执行。但是,如果块中的某一条语句抛出异常,执行不会终止,而是立即跳到@catch块,在那里继续执行。在@catch块内可以处理异常。这里可行的执行顺序是记录出错消息、清除和终止执行。

下面的代码演示了异常处理,紧跟着的是程序的输出。















#import “Fraction.h”
int main (int argc, char *argv [])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *f = [[Fraction alloc] init];
@try {
[f noSuchMethod];
}
@catch (NSException *exception) {
NSLog(@”Caught %@%@”, [exception name], [exception reason]);
}
NSLog (@”Execution continues!”);
[f release];
[pool drain];
return 0;
}
输出结果:
1
2
3
4
*** -[Fraction noSuchMethod]: unrecognized selector sent to instance 0x103280
Caught NSInvalidArgumentException: *** -[Fraction noSuchMethod]:
unrecognized selector sent to instance 0x103280
Execution continues!
出现异常时,@catch块被执行。包含异常信息的NSException对象作为参数传递给这个块。如你所见,name方法检索异常的名称,reason方法给出原因(运行时系统还会将原因自动输出〕。
原创粉丝点击