Fortify 是一个小型的 Swift 包,它可以使 Swift 在面对目前会导致致命错误的场景(例如强制解包 nil 或类型转换错误)时更加健壮。
像使用现有的 Swift 异常一样使用 Fortify,只不过异常是为 Swift 错误自动生成的。错误被手动向上抛出堆栈,而无需中间函数声明为抛出。例如:
import Fortify
do {
try Fortify.protect {
var a: String!
a = a!
}
} catch {
NSLog("Unwrap error: \(error)")
}
在该示例中,强制解包 nil 将会生成一个异常,而不是终止应用程序。要在 Xcode 中看到它运行,您需要在调试器之外运行示例应用程序。
有一个新的入口点 Fortify.protect(runLoop: Runloop.main)
,它尝试保护应用程序免于在主 RunLoop 中处理事件时发生的故障,在 fortifyUIKit
目标中。虽然它与 UIKit 的交互效果不佳,与 SwiftUI 的交互效果非常差。您可以使用它来防止应用程序的无序退出,但除了提供比崩溃更友好的错误对话框之外,不要用它做太多其他的事情。
这种异常抛出形式相当粗暴,因为它不会清理中间帧中使用的活动对象、操作、锁或系统资源。 建议在非常重要的情况下不要崩溃,例如在开发 Swift 应用程序服务器时。 对于发生错误后应用程序的可靠性不做任何保证,尽管通常不良影响应仅限于内存和系统资源的泄漏。 更详细的关于 Fortify 如何工作以及它如何使用 setjmp/longjmp 的说明请点击这里。