Dai*_*Dai 8 cocoa-touch ios swift
我有一个用Xcode 8.2.1编写的Swift 2中的iOS应用程序,它是为iOS 10.2构建的.
我从TestFlight获得了许多崩溃报告,尽管有符号表示,但崩溃日志除了堆栈跟踪(没有参数值,没有本地,没有堆对象等)之外都没有显示任何程序状态.
...但在这些函数中我可以看到可能失败的代码(例如强制解包)但崩溃日志并没有告诉我它失败的地点或原因.
在Xcode中调试时,我可以使用fatalError(message: String)我可以将自己的消息放在哪里"functionFoo returned nil"或者"variable bar == \"" + bar + "\"",除非使用TestFlight或App Store部署时fatalError将被命中并且程序终止,但该message值不会保存到崩溃日志中,使其无意义.
在其他环境中,比如C#/.NET和Java,我可以简单地throw new SomeExceptionType("my message")在所有的全局catch(Exception)处理程序中提供所有信息.
如何在iOS/Swift中实现相同的目标?
Sou*_*unt -1
Swift 确实支持错误处理。您可以通过确认协议来创建自己的错误类型Error或使用现有的错误类型,然后通过调用抛出错误throw error。
但 Swift 强制您向任何可能引发错误的代码添加错误处理。有多种方法可以快速处理错误。
将throws关键字应用于您的函数,这表明该函数在调用时可能会抛出错误,并且该错误应由调用者处理。
func canThrowErrors() throws -> String
Run Code Online (Sandbox Code Playgroud)
当使用关键字调用方法时,throws必须try在调用的开头添加关键字。所有这些try调用都应该通过应用throws到方法来仅传播错误或包装在 do-catch 块内来处理:
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
}
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用try?和try!来抛出函数调用来禁用错误传播并检索在出现错误和运行时断言时分别返回 nil 的可选结果。
通过强制您在编译时处理所有错误,swift 可以避免任何未定义的运行时行为和调试噩梦。
fatalError我建议仅在无法从状态恢复而不使应用程序崩溃的情况下使用或任何其他运行时断言。不幸的是,没有办法处理错误,fatalError因为它的使用仅适用于此类场景。此外,在崩溃日志中,您只会获得导致崩溃的行号,以获取有关崩溃原因的其他信息,我建议使用自定义日志记录或分析。
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |