了解 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有什么区别?