美文网首页
Objective-C中使用@try处理异常

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

作者: 吃瓜群众呀 | 来源:发表于2016-08-09 14:06 被阅读50次

    转载自:http://www.itivy.com/iphone/archive/2011/12/20/iphone-objective-c-try-catch-statement.html

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

    这一篇我们主要来讲讲Objective-C中的@try块来处理异常,与@try结合一起的有@catch、@finally。文章非常基础,希望对初学者有所帮助。

    在我们编写Objective-C程序时,最好的编程实践是指能预测程序中可能出现的问题。为此,你可以测试使程序异常终止的条件并处理这些情况,可能要

    记录一条消息并完全终止程序,或者采取其他正确措施。以避免错误为例,在程序运行时执行测试可以避免向对象发送未识别的消息。当试图发送这类未识别消息

    时,程序通常会立即终止并抛出一个异常。

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

    #import “Fraction.h”

    intmain (intargc,char*argv [])

    {

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    Fraction*f = [[Fraction alloc] init];

    [fnoSuchMethod];

    NSLog(@”Execution continues!”);

    [f release];

    [pool drain];

    return0;

    }

    你可以不管警告消息继续运行程序。如果这样做,程序可能会异常终止,并出现类似如下的错误:

    -[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”

    intmain (intargc,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];

    return0;

    }

    输出结果:

    -[Fraction noSuchMethod]: unrecognized selector sent to instance 0x103280

    Caught

    NSInvalidArgumentException: *** -[Fraction noSuchMethod]:

    unrecognized

    selector sent to instance 0x103280

    Execution

    continues!

    出现异常时,@catch块被执行。包含异常信息的NSException对象作为参数传递给这个块。如你所见,name方法检索异常的名称,reason方法给出原因(运行时系统还会将原因自动输出〕。

    这是一个非常简单的例子,演示了如何在程序中捕获异常。可以使用@finally块包含是否执行抛出异常的@try块中的语句代码。

    @throw指令允许你抛出自己的异常。可以使用该指令抛出特定的异常,或者在@catch块内抛出带你进入类似如下代码块的异常:

    @throw;

    自行处理异常后(例如,可能是在执行清除工作后)可能需要这么做。然后便可以让系统处理其余的工作。最后,可以使用多个@catch块按顺序捕获并处理各种异常。

    相关文章

      网友评论

          本文标题:Objective-C中使用@try处理异常

          本文链接:https://www.haomeiwen.com/subject/jnpmjttx.html