当前位置:  开发笔记 > IOS > 正文

在什么情况下,在Cocoa的try/catch/finally异常处理中@finally是非冗余的?

如何解决《在什么情况下,在Cocoa的try/catch/finally异常处理中@finally是非冗余的?》经验,为你挑选了3个好方法。

考虑以下Cocoa/Obj-C代码片段:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    NSLog(@"Exception occurred: %@", [e description]);
}
@finally {
    [obj cleanUp];
}

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    NSLog(@"Exception occurred: %@", [e description]);
}
[obj cleanUp];

在什么情况下会在第一个片段导致[obj cleanUp]被调用,而第二个将无法在导致[obj cleanUp]被称为?换句话说,在@finally使用Cocoa异常处理时,在什么情况下是非冗余的?



1> dstnbrkr..:

在这些情况下没有区别,因为吞下了异常.这里有两种情况,其中有一个区别:

调用[obj cleanUp]:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;      
}
@finally {
    [obj cleanUp]; // called when exception is caught
}

[obj cleanUp]未被调用:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;
}
[obj cleanUp]; // not called when exception is caught



2> s4y..:

值得注意的是,@finally当控件以任何理由退出@try块时,块中的代码将运行,即使是通过或.例如:returngoto

@try {
    doStuff();
    if(bail){
        return;
    }
    doMoreStuff();
}
@finally {
    [obj cleanUp];
}
[obj announceSuccess];

[obj cleanUp]即使bail是真的也会执行,但[obj announceSuccess]不会.



3> Jens Ayton..:

在那种情况下,你要压缩异常,没有.@finally用于在您不捕获异常或重新抛出异常时进行清理,在任何一种情况下都会对调用代码留下最终异常响应.由于Cocoa中的异常仅被用于编程错误并因此很少发生,因此这是完全合理的事情.

这也是值得指出的一个情况下,你并不需要使用@finally,这是当你建立自己的自动释放池.当"父"自动释放池被销毁时,任何尚未清理的内部池也将被破坏.如果您确实尝试自行清理它,则需要从自动释放池中提升异常.


需要使用
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有