【问题标题】:Understanding try catch , swift3 xcode [duplicate]了解 try catch , swift3 xcode [重复]
【发布时间】:2017-03-24 21:51:53
【问题描述】:

使用 swift3,我想处理一个错误,

public func titulo()
        {do{
            marca.snippet=address_components?[1].short_name
            marca.title = try (address_components?[2].short_name)!+" "+(address_components?[3].short_name)!
            //return titulo
        }catch{
            marca.title="sin titulo"
            }

    }

address_components 为 nil 时调用错误,但在调试中:

我能做些什么来解决这个问题?

【问题讨论】:

标签: swift


【解决方案1】:

try / catch 不会捕获异常,只会抛出错误。在使用隐式展开的选项(!)时,它无法帮助您避免崩溃。警告在这里是一个很好的提示。

【讨论】:

    【解决方案2】:

    这里发生了两件事:1) try/catch,以及 2) 强制解包选项。

    更新: try/catch 很好。 你在try/catch 中的代码实际上不是throw。因此,您不需要那里的try/catch

    throw 的一个例子是FileManager.contentsOfDirectory。在Apple's documentation 中看起来像这样(注意throws 关键字):

    func contentsOfDirectory(at url: URL, 
    includingPropertiesForKeys keys: [URLResourceKey]?, 
                 options mask: FileManager.DirectoryEnumerationOptions = []) throws -> [URL]
    

    您也可以创建自己的函数throw,但您当前的代码不能。这就是您收到'catch' block is unreachable... 消息的原因。

    第二个问题是可选的。

    Swift 中的“可选”可能是 nil(空,没有值)。

    您的代码包含以下两部分:(address_components?[2].short_name)!(address_components?[3].short_name)!

    ! 标记表示您确定这些项目不会为零! (想想! 告诉系统“是!它不是零!”同样,想想? 说,“嗯,这是空的吗?这有价值吗?”)

    事实证明,其中一个值为 nil。因此,斯威夫特不知道该怎么办。崩溃和燃烧! ;)

    因此,除了您的try/catch,您还需要一些guard 语句或if let 语句以确保您的值不为零。

    【讨论】:

    • 不,do/catch 不好,因为 try 内的代码不会抛出。
    • ! 的更好描述是“如果为零则崩溃”。当您确定它不是 nil 而是错误时,Swift 知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多