Swift 触发崩溃的preconditionFailure和assertionFailure
Swift 触发崩溃的preconditionFailure和assertionFailure

Swift 触发崩溃的preconditionFailure和assertionFailure

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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注