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