2012-08-11 55 views
2

我发现了Xcode的奇怪行为。 在此代码中,Xcode调试器不会中断未捕获的异常。如果finally块返回,Xcode调试器无法捕获异常

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

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

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

如果@finallyreturn小号调试器无法捕获该异常。你见过这个问题吗?我不确定这是一个真正的问题。从角度来看,它看起来像设计的行为。我不知道为什么。 @finally块不应该return吗?我的问题是它无声地吞噬异常,所以我无法检测到它。

对我感到羞耻,我不太清楚尝试......赶上......最后的行为。我几乎没有使用异常捕获代码。这是设计的行为还是错误行为?这是任何已知的问题?

这是我的环境。

  • 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..."); 
    } 
} 
+4

听起来像一个潜在的错误,是你正在编译的实际代码?无论如何,Cocoa/iOS **中的异常并不旨在用于可恢复错误**。当Cocoa/iOS抛出异常时,一般的行为是报告并崩溃。 – bbum 2012-08-11 15:20:26

+0

这只是测试的临时代码,但它是我编译的实际代码。 – Eonil 2012-08-11 18:20:24

回答

1

return放在@finally块中似乎是一个坏主意。异常处理机制将试图展开调用堆栈,因为它处理您抛出的异常。如果@finally块更改堆栈中的内容,则会破坏异常处理程序。这似乎并不令人惊讶地发生这种崩溃。另外,正如bbum指出的,Cocoa和Cocoa Touch中的流程控制不使用异常。通过Cocoa方法抛出异常通常会失败。即使你正在做的事情应该在通用的Objective-C中工作,它可能仍然会导致实际代码中的问题。

简短回答:不要这样做。