【问题标题】:How to handle all the exceptions in ios app如何处理ios应用程序中的所有异常
【发布时间】:2015-06-22 17:12:43
【问题描述】:

ios 中是否有任何方法可以在单个 try catch 块中处理整个应用程序中发生的所有异常。

如果是,我应该在哪里写这个块。

【问题讨论】:

  • 不幸的是,没有。您必须创建运行良好的代码:) 您可以分析崩溃日志以查找所有关键异常来修复它们。这些是获取崩溃的有用服务(例如 Crashlytics)。
  • 我还会问自己“为什么要处理未处理的异常?”更好的解决方案可能是在尝试使用该对象之前确保该对象及其状态。我不是 Try/Catch 的粉丝,除非你正在处理一些你无法控制的第三方库。对于您确实可以控制(您的代码)的事情,无论何时使用 Try/Catch 都应该受到质疑。

标签: ios objective-c exception-handling


【解决方案1】:

您可能想了解一下在 iOS 中全局处理异常的概念。我可能无法给出最正确的答案,但这些链接可以让您更清楚地了解您可能想要什么。

iOS Global Exception Handling

Global Exception Handler in iOS

希望这会有所帮助。

【讨论】:

  • 在 Objetive-C 中的异常不能可靠地从中恢复,也不能成功地用于程序控制。它们仅用于捕获不可恢复的编程错误。
  • 当然是的,它们提供更复杂的堆栈跟踪和消息,但是如果您需要顶级异常处理程序,可能没有任何其他选项可用,排除 OP 的要求,因为那不是可用于 iOS 范围。
  • Objective-C 不会在异常时清理堆栈上的对象,这包括强保留对象。
【解决方案2】:

假设问题是关于 Objective-C 的,则不需要处理异常,因为它们不用于程序控制。异常仅用于捕获不可恢复的编程错误,因此如果遇到异常,则需要修复代码。

通常,堆栈帧之间的异常不会以可恢复的方式处理。

最好的办法是在 Xcode 中添加一个异常断点,以便更好地检查异常:

从 Mian 菜单 Debug:Breakpoints:Create Exception Breakpoint。运行应用程序以获取断点。当您点击异常断点单击调试继续几次,您将获得回溯和更多错误信息。将它和 Xcode/Debugger 消息的精确副本添加到问题中。

将此断点更改为“仅限 Objective-C”也是一个好主意。

【讨论】:

    【解决方案3】:

    您可以使用NSSetUncaughtExceptionHandler 设置处理程序。

    斯威夫特:

    NSSetUncaughtExceptionHandler { (exception) in
        while true {
            sleep(UInt32(0.5))
        }
    }
    

    目标-C:

    void handleException(NSException* exception) {
        while true {
            sleep(0.5);
        }
    }
    
    NSSetUncaughtExceptionHandler(handleException);
    

    当处理程序返回时,应用程序崩溃并且 Xcode 显示错误。所以你可以运行一个循环,直到你想退出应用程序。我不建议让应用程序保持正常运行,但您可以显示例如发生错误的警报,当用户点击按钮时,应用程序会崩溃。为循环使用标志。

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2013-05-07
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多