preconditionFailure() 和 assertionFailure() 都是 Swift 中用于触发程序崩溃的函数,但它们在不同的模式下行为有所不同,适用于不同的场景。
preconditionFailure()
基本语法
preconditionFailure(message)
message:自定义的错误信息,可帮助定位问题(可选)。
preconditionFailure() 的行为
1、在 Debug 和 Release 模式下都会触发崩溃:
无条件触发程序崩溃,无论是 Debug 还是 Release 模式。
2、适合用于关键逻辑路径:
当程序进入不应到达的代码路径或不可恢复的状态时使用。
3、终止程序,打印自定义错误信息:
程序崩溃,并将错误信息打印到控制台。
使用示例
func process(value: Int) {
guard value >= 0 else {
preconditionFailure("值不能为负数!")
}
print("处理值:\(value)")
}
process(value: -1) // ❗️ Debug 和 Release 模式都会触发崩溃
assertionFailure()
基本语法
assertionFailure(message)
message:自定义的错误信息,可帮助定位问题(可选)。
assertionFailure() 的行为
1、仅在 Debug 模式下生效:
assertionFailure() 只会在 Debug 模式下触发崩溃。
在 Release 模式下,assertionFailure() 会被忽略,不会触发崩溃。
2、适合用于调试期间捕获非法状态:
当代码到达不应触达的逻辑分支 时使用。
3、用于检测开发阶段的错误:
在 Debug 模式下可以捕获潜在的逻辑问题,在 Release 模式下不影响程序运行。
使用示例
func validate(value: Int) {
if value < 0 {
assertionFailure("值不应该为负数!")
}
}
validate(value: -5) // ❗️ Debug 模式崩溃,Release 模式无影响
什么时候使用 preconditionFailure()?
1、推荐使用:
关键业务逻辑中,不应出现的非法状态。
生产环境中无法容忍的错误,必须立即终止程序。
例如:
非法参数传递
未知的枚举值
关键路径不可达的代码
2、避免使用:
可恢复的错误,建议使用 throw 或 do-catch 处理。
什么时候使用 assertionFailure()?
1、推荐使用:
调试时检测潜在逻辑错误。
仅在 Debug 模式下验证不应触达的代码路径。
例如:
开发阶段的调试
不应触发的逻辑分支
2、避免使用:
关键路径的条件检查,因为在 Release 模式下它会被忽略。
总结
使用 preconditionFailure():
关键逻辑中,不应触发的代码路径。
适合在生产环境中防止非法状态。
使用 assertionFailure():
调试期间捕获潜在的逻辑错误。
仅在 Debug 模式下进行条件验证。
使用 fatalError():
明确表示不应触发的代码路径。
适用于不可恢复的致命错误。
相关文章
1、Swift触发崩溃的assert:https://fangjunyu.com/2025/03/29/swift%e8%a7%a6%e5%8f%91%e5%b4%a9%e6%ba%83%e7%9a%84assert/
2、Swift触发崩溃的precondition:https://fangjunyu.com/2025/03/29/swift%e8%a7%a6%e5%8f%91%e5%b4%a9%e6%ba%83%e7%9a%84precondition/