我发现了Xcode的奇怪行为。 Xcode调试器不会因此代码中的未捕获异常而中断。
@try { @throw @"AA"; }
@catch (...) { @throw; }
@finally { return; }
但此代码中的异常捕获并触发Xcode中断执行以进行调试。
@try { @throw @"AA"; }
@catch (...) { @throw; }
@finally { }
如果@finally
阻止return
的调试器无法捕获异常。你见过这个问题吗?我不确定这是一个真正的问题。从视角来看,它看起来像设计的行为。我不知道为什么。 return
阻止我不应该@finally
吗?我的问题是它无声地吞下异常,所以我无法检测到它。
对我感到羞耻,我不太清楚尝试......抓住...最后的行为。我几乎没有使用异常捕获代码。这是设计行为还是错误行为?这是任何已知的问题吗?
这是我的环境。
修改
我附上完整的测试源代码。
#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...");
}
}
答案 0 :(得分:1)
将return
置于@finally块中似乎是一个坏主意。异常处理机制将尝试解除调用堆栈,因为它处理您抛出的异常。如果@finally块改变了堆栈上的内容,则会破坏异常处理程序。这种崩溃似乎并不令人惊讶。
另外,正如bbum指出的那样,Cocoa和Cocoa Touch中的流控制不使用异常。通过Cocoa方法抛出异常通常会失败。即使你正在做的事情应该在通用的Objective-C中工作,它仍然可能在实际代码中引起问题。
简答:不要这样做。