了解 try catch , swift3 xcode [重复]

Posted

技术标签:

【中文标题】了解 try catch , swift3 xcode [重复]【英文标题】:Understanding try catch , swift3 xcode [duplicate] 【发布时间】: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 时调用错误,但在调试中:

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

【问题讨论】:

相关:How do I catch “Index out of range” in Swift?。答案很简单,你没有捕捉到运行时错误——你首先防止它发生(即by safely unwrapping the optional 并且不索引超出集合的范围)。 【参考方案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 知道该怎么做。

以上是关于了解 try catch , swift3 xcode [重复]的主要内容,如果未能解决你的问题,请参考以下文章

try/catch 和 MFC TRY/CATCH 有啥区别?

try / catch和MFC TRY / CATCH有什么区别?

何时使用 try/catch 块?

Swift 3 中的错误处理

javajava try catch finally 字节码原理 finally语句为何一定会执行

啪啪,打脸了!领导说:try-catch必须放在循环体外!