如何在 Swift 中捕获/记录致命错误?

Posted

技术标签:

【中文标题】如何在 Swift 中捕获/记录致命错误?【英文标题】:How can I capture / log a fatal error in Swift? 【发布时间】:2015-05-14 17:03:08 【问题描述】:

例如,fatal error: unexpectedly found nil while unwrapping an Optional value。不管是什么原因,是否可以捕获这些数据?这是stderr 还是别的什么?

编辑:我在http://swiftdoc.org/func/fatalError/ 找到了一个引用,上面写着函数(我假设这确实是 Swift 内部调用的函数)“无条件打印一条消息并停止执行。”。因此,除了通过 TestFlight 崩溃报告或实际将设备放在手边获取远程崩溃报告之外,也许没有什么可做的了。

我可以通过main.swift 中的NSSetUncaughtExceptionHandler 记录所有未捕获的异常,并且我们可以在应用程序的其他部分进行良好的记录,只要可能发生错误(但可能)。我还希望记录这些致命错误,以便我们的日志更完整地显示远程测试设备上发生的崩溃情况。

【问题讨论】:

您希望准确捕获哪些数据? 好吧,最好能简单地捕获致命错误字符串并将其用于额外的调试。我正在使用 Logentries 在应用程序中记录错误、未捕获的异常等,同时我们正在跨多个团队成员开发它。如果可能的话,应该记录致命错误,但我正在摸不着头脑。 【参考方案1】:

某些错误将转到stderr。这是一个简单的例子:

$ cat tryit 
#! /usr/bin/env swift

println ("foo")
precondition (false, "bar")
$ ./tryit 2> /tmp/error 1> /tmp/noterror
Illegal instruction: 4
$ cat /tmp/noterror 
$ cat /tmp/error
precondition failed: bar: file ./tryit, line 4
0  swift                    0x000000010f7faa18 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x000000010f7faef4 SignalHandler(int) + 452
...

如果删除precondition,则结果转到stdout

$ cat tryit 
#! /usr/bin/env swift

println ("foo")
$ ./tryit 2> /tmp/error 1> /tmp/noterror
$ cat /tmp/noterror 
foo
$ cat /tmp/error 

【讨论】:

感谢您的信息。我无法在 Apple 的 Swift 书籍或开发人员文档中找到对 fatal error 的引用以及它的行为方式,但我确实在 swiftdoc.org/func/fatalError 找到了这个引用,它说 fatalError() 函数“无条件打印一条消息并停止执行。”如果是这样的话,也许它真的无法在任何意义上被抓住,我只剩下一个远程崩溃报告来获取。

以上是关于如何在 Swift 中捕获/记录致命错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常

使用 Monolog 在 Symfony2 中记录 PHP 致命错误

如何修复 PHPUnit 中的“PHP 致命错误:未捕获的 TypeError:getTest() 参数”错误

如何解决 PHP 致命错误:未捕获的错误:在 laravel 版本更新时调用未定义的方法 Illuminate\Container\Container::basePath() 错误?

如何捕获致命错误:PHP 中的最大执行时间超过了 30 秒

无法使用 gmail SMTP 在 Zend 中发送电子邮件。出现致命错误:未捕获的异常“Zend_Mail_Protocol_Exception”。如何解决这个问题?