【问题标题】:Swift app stops running after an errorSwift 应用程序在出错后停止运行
【发布时间】:2018-11-28 17:29:41
【问题描述】:

发生运行时错误后,我的 iOS 应用程序停止运行。我将错误视为异常。我希望应用程序在错误处理后继续运行到下一步。任何建议如何做到这一点?

do {
    guard let ps: Element = try! docu.getElementById("product-name")! else { ide = "" }
    if ps != nil {
        ide = (try ps.text())
    }
} catch {
    print("error")
    ide = ""
}

【问题讨论】:

  • 永远不要在guard let 中使用!。它否定了guard 的全部观点。
  • if ps != nil 毫无意义,因为guard 保证ps 不能是nil(或可选)。
  • 你不能处理异常,只能处理抛出的错误。使用您遇到的异常的详细信息更新您的问题,并指出导致异常的确切行。

标签: ios swift


【解决方案1】:

我认为您在这里过度使用了!(强制展开)符号。它不能优雅地处理 nil 值,事实上,它会崩溃。

我想你可能想在这里做的是

guard
    let ps: Element = try? doc.getElementById("product-name"),
    let ide = try? ps.text()
    else {
    print("error")
    ide = ""
}
// ide is guaranteed to be valid here
...

请注意,如果您使用try?,则无需“捕获”错误,它只会返回一个可选值,nil,如果调用会引发异常。


或者你可以简单地

let ps: Element = try? doc.getElementById("product-name")
let ide = try? ps?.text()
// ide will be an optional value here

如果你真的不想guard/if let...

【讨论】:

  • 我会修复代码,但是如何防止应用程序在发生异常并被处理后停止在 ios 模拟器中?
  • 我认为只需删除您的!s 就可以防止这种情况发生,这将是您崩溃的原因(应用程序停止)。但是,对于您要实现的目标,我认为您最好像我所展示的那样简单地使用可选符号。
  • 有没有办法在不使用守卫的情况下做到这一点?
  • 当然,你可以翻转它并使用if let,但你为什么不想使用guard?这是 swift 最美丽的部分之一 :)
  • @py_ios_dev 任何通过guard let 声明的变量都可以在guard 语句之后使用。
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2018-03-31
相关资源
最近更新 更多