2012-02-23 78 views
2

所有在Xcode停止采伐误差,如何使@try @catch

我有一段代码运行在大量的记录,并在大约一半的情况下,失败(这是确定的,一些记录简单地没有所需的数据)我把这段代码放在一个@try @catch块中,使它运行顺利,我们试图做我们的事情,如果我们失败了,我们有一些默认的行为。

当它在@try块中失败时,它经常是无法识别的选择器错误,因为它位于@try块中,我发现这个错误,但它仍然每次都被记录下来,即使我没有从我的@ catch块。这非常烦人,因为它堵塞了我的日志记录。如果我想从@ try/@ catch中记录错误,我会在@catch右边处理这个问题吗?

我怎么能阻止在@try块错误记录那些在@catch块随后解决的XCode?

我使用的XCode 4.2

感谢

+0

在Objective-C中,您通常应避免使用异常(@ try/@ catch [/ @ finally])进行流量控制。例外情况的成本非常高(与运行时间相比,如JVM或针对异常使用进行了优化的CLR)。而且,大多数Cocoa框架并不是特例安全的。因此,通过Cocoa框架代码抛出异常是很危险的,并且可能会导致您的应用程序出现奇怪,难以诊断和灾难性的情况(考虑可能的数据丢失)。 – 2012-02-23 09:28:58

+0

代替使用异常,Cocoa代码使用NSError来指示应用程序内可恢复的错误条件。异常用于表示应用程序无法恢复的条件。 – 2012-02-23 09:29:03

回答

1

在Objective-C使用例外可以出现在一个程序中的任何正常的情况是一个没有去。异常仅用于发现和捕获编程错误并正常终止。问题在于,所有标准库(Cocoa,CoreFoundation,C标准库,...)都不是为了处理异常而构建的,并且如果异常通过它们,将无法清理资源。

从理论上讲,如果你确信你正确地做你的记忆力和其他清理,不通过对外代码扔你可以使用异常。如果你使用ARC,那么有一个编译器开关-fobjc-arc-exceptions可以帮助你正确地获得内存管理(在你的代码中)。

常见的做法是不使用在所有异常(比其他错误,例如使用NSAssert)。

+0

我知道这不是最好的方法,但它不是我的问题/解决方案的答案。 – ophychius 2012-02-23 10:02:11

+0

我写了这个答案,以明确唯一干净的解决方案是改变你的架构。你必须防止发生错误。 Objective-C可以在很多方面帮助你,但你必须采用Cocoa的编码模式。 – 2012-02-23 10:32:36

+0

你是对的,我会去改变我的代码到一个更合适的架构。 – ophychius 2012-02-24 10:25:09

0

异常本身不会将任何消息记录到控制台。 Xcode(默认情况下)都不记录任何异常抛出。

就这么抛出异常之前写入的消息的错误捕获代码。 NSObject的doesNotRecognizeSelector:将在发送无法识别的选择器时打印消息。您无法关闭此功能。

+0

这个答案确实增加了一些清晰度 – ophychius 2012-02-24 10:25:31

0

所以你想看到某些日志消息,但不是其他人。如何重定向调试器输出into a file。在该文件上使用grep或具有良好过滤功能的文本编辑器来扫描您想查看的消息。从gdb控制台复制粘贴到edtor将执行相同的技巧。