【问题标题】:Xcode debugger can't catch exception if finally block returns如果 finally 块返回,Xcode 调试器无法捕获异常
【发布时间】:2023-03-14 13:07:01
【问题描述】:

我发现了 Xcode 的奇怪行为。 Xcode 调试器不会因为这段代码中的未捕获异常而中断。

@try            { @throw @"AA"; }
@catch (...)    { @throw;       }
@finally        { return;       }

但此代码中的异常捕获并触发 Xcode 中断执行以进行调试。

@try            { @throw @"AA"; }
@catch (...)    { @throw;       }
@finally        {               }

如果@finally 阻止returns 调试器无法捕获异常。你见过这个问题吗?我不确定这真的是一个问题。从角度来看,它看起来像设计的行为。我不知道为什么。我不应该在@finally 中阻止return 吗?我的问题是它会默默吞下异常,所以我无法检测到它。

真丢脸,我不太懂 try...catch...finally 行为。我几乎没有使用异常捕获代码。这是设计的行为还是错误的行为?这是任何已知问题吗?

这是我的环境。

  • Xcode 版本 4.4 (4F250)
  • OS X 10.7.4

编辑

我附上完整的测试源代码。

#import <Foundation/Foundation.h>

int main (int a, char** b)
{
    @try
    {
        NSLog(@"trying something...");

        @try            { @throw @"AA"; }
        @catch (...)    { @throw;       }
        @finally        { return 0;     }
    }
    @catch (...)
    {
        NSLog(@"something catched.");
    }
    @finally
    {
        NSLog(@"finally...");
    }
}

【问题讨论】:

  • 听起来像是一个潜在的错误,这是您正在编译的实际代码吗?无论如何,Cocoa/iOS 中的异常并非旨在用于可恢复的错误。当 Cocoa/iOS 中抛出异常时,一般的行为是报告并崩溃。
  • 这是临时代码,仅供测试,但它是我编译的实际代码。

标签: objective-c xcode debugging exception


【解决方案1】:

return 放在@finally 块中似乎是个坏主意。异常处理机制将在处理您抛出的异常时尝试展开调用堆栈。如果 @finally 块更改了堆栈上的内容,则您破坏了异常处理程序。崩溃似乎一点也不奇怪。

此外,正如 bbum 所指出的,异常不用于 Cocoa 和 Cocoa Touch 中的流控制。通过 Cocoa 方法抛出异常通常会失败。即使你正在做的事情应该在通用的 Objective-C 中工作,它可能仍然会在实际代码中导致问题。

简答:不要那样做。

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 2021-09-21
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多