【问题标题】:How to make xCode stop logging error within a @try @catch如何使 xCode 在@try @catch 中停止记录错误
【发布时间】:2012-03-13 16:29:12
【问题描述】:

全部,

我有一段代码运行在很多记录上,并且在大约一半的情况下失败(这没关系,有些记录根本没有所需的数据)我把这段代码放在 @try @catch阻止以使其顺利运行,我们尝试做我们的事情,如果我们失败了,我们有一些默认操作。

当它在@try 块中失败时,通常是一个无法识别的选择器错误,因为它在@try 块中我捕获了这个错误,但它仍然每次都被记录,即使我没有从我的@catch 记录堵塞。这很烦人,因为它阻塞了我的日志记录。如果我想记录来自@try/@catch 的错误,我会在@catch 中处理它,对吗?

如何阻止 XCode 在 @try 块中记录错误,这些错误随后在 @catch 块中得到解决?

我正在使用 XCode 4.2

谢谢

【问题讨论】:

  • 您通常应该避免在 Objective-C 中使用异常 (@try/@catch[/@finally]) 进行流控制。异常带来异常大的成本(与运行时相比,例如 JVM 或为异常使用而优化的 CLR)。此外,大多数 Cocoa 框架都不是异常安全的。因此,通过 Cocoa 框架代码引发异常是危险的,并且可能会在您的应用中导致奇怪的、难以诊断的和灾难性的(考虑可能的数据丢失)错误。
  • Cocoa 代码不使用异常,而是使用 NSError 来指示可在应用程序中恢复的错误条件。异常用于指示您的应用程序无法从中恢复的条件。

标签: ios xcode logging


【解决方案1】:

所以你想看到某些日志消息而不是其他的。如何重定向调试器输出into a file。在该文件上使用grep 或具有良好过滤功能的文本编辑器来扫描您想要查看的消息。从 gdb 控制台复制并粘贴到编辑器中也可以实现同样的效果。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个答案确实增加了一些清晰度
    【解决方案3】:

    在 Objective-C 中,对程序中可能出现的任何正常情况使用异常是不行的。异常仅用于发现和捕获编程错误并优雅地终止。问题是所有标准库(Cocoa、CoreFoundation、C 标准库……)都不是为了处理异常而构建的,如果异常通过它们,它们将无法清理资源。

    理论上,如果您确保正确执行内存和其他清理工作并且不抛出外来代码,则可以使用异常。如果您使用 ARC,则有一个编译器开关 -fobjc-arc-exceptions 可以帮助您正确进行内存管理(在您的代码中)。

    通常的做法是根本不使用异常(除了错误,例如使用NSAssert)。

    【讨论】:

    • 我知道这不是完美的方法,但它不是我的问题的答案/我的问题的解决方案。
    • 我写这个答案是为了清楚地表明唯一干净的解决方案是改变你的架构。您必须防止发生错误。 Objective-C 可以在很多方面为您提供帮助,但您必须采用 Cocoa 的编码模式。
    • 你说得对,我会去把我的代码改成更合适的架构。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2020-08-18
    • 2014-09-09
    • 2020-08-02
    相关资源
    最近更新 更多