如何将 fatalError 消息保存到 iOS 崩溃日志中?

How can I save the fatalError message to the iOS crash log?

提问人:Dai 提问时间:2/20/2017 更新时间:8/26/2023 访问量:1865

问:

我有一个用 Xcode 8.2.1 的 Swift 2 编写的 iOS 应用程序,它是为 iOS 10.2 构建的。

我从 TestFlight 收到了许多崩溃报告,尽管有符号化,但除了堆栈跟踪之外,没有一个崩溃日志显示任何程序状态(没有参数值、没有局部变量、没有堆对象等)。

...但是在这些函数中,我可以看到可能失败的代码(例如强制解包),但崩溃日志没有告诉我它在哪里或为什么失败。

在 Xcode 中调试时,我可以使用可以放置自己的消息的地方,例如 或 ,除非使用 TestFlight 或 App Store 部署时,会被命中并且程序终止,但该值不会保存到崩溃日志中,因此毫无意义。fatalError(message: String)"functionFoo returned nil""variable bar == \"" + bar + "\""fatalErrormessage

在其他环境中,如 C#/.NET 和 Java,我可以简单地,所有信息都可以在我拥有的任何全局处理程序中使用。throw new SomeExceptionType("my message")catch(Exception)

如何在 iOS / Swift 中实现相同的目标?

iOS Swift Cocoa-Touch

评论

0赞 Guy Kogus 10/19/2017
你有没有找到办法?
1赞 randomcontrol 2/7/2020
大约 3 年后,仍然是同样的问题,没有解决方案:-(似乎我们需要使用第三方错误报告解决方案
0赞 Au Ris 5/2/2022
好问题,但没有答案?:)

答:

-1赞 Soumya Mahunt 9/15/2022 #1

Swift 确实支持错误处理。您可以通过确认 Error 协议来创建自己的错误类型,也可以使用现有的错误类型,然后通过调用 抛出错误。throw error

但是 Swift 会强制你向任何可能引发错误的代码添加错误处理。有多种方法可以在 swift 中处理错误。

  1. 将关键字应用于函数,这表示函数在调用时可能会引发错误,并且错误应由调用方处理。throws

    func canThrowErrors() throws -> String
    
  2. 使用关键字调用方法时,必须在调用开始时添加关键字。所有这些调用都应该通过应用于方法来传播错误或包装在 do-catch 块中来处理:throwstrytrythrows

    do {
        try canThrowErrors()
        try canThrowOtherErrors()
    } catch is SpecificError {
        // handling only specific error type
    } catch let error as SpecificError {
        // catches only specific error for type
    } catch {
        // catches all errors
    }
    
  3. 此外,您可以使用 and for 抛出函数调用来禁用错误传播,并检索在错误和运行时断言时分别返回 nil 的可选结果。try?try!

通过强制您在编译时处理所有错误,swift 避免了任何未定义的运行时行为和调试噩梦。

我建议仅在无法在不使应用程序崩溃的情况下从状态中恢复的情况下才使用或任何其他运行时断言。不幸的是,没有办法处理错误,因为它的使用仅保留用于此类情况。此外,在崩溃日志中,您只会获得导致崩溃的行号,以获取有关崩溃原因的其他信息,我建议使用自定义日志记录或分析。fatalErrorfatalError