【发布时间】:2017-02-13 17:12:06
【问题描述】:
我是一名 c# 开发人员,所以我非常习惯于将整个代码块包装在 try catch 中,写入事件日志然后不用担心它。
我只是无法快速解决问题
我正在使用 Kanna HTML/XML pod 来解析 html 页面并在表格中查找链接并提取它们。我是这样做的
enum MyError: Error {
case FoundNil(String)
}
if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8)
{
var count = 0
//loop through all instances of <tr> in the html
for row in doc.xpath("//tr") {
var linkName = ""
do{
//get the <a> text from inside a <div> from the 2nd <td>
if let name = row?.xpath("//td[2]//div//a[1]")[count]
{
linkName = name.text
}
else{
throw MyError.FoundNil("name")
}
count = count + 1
}
catch{
print("Error: \(error)")
}
}
}
问题是我并不总是知道在 xpath //td[2]//div//a[1] 的表格单元格中会有一个链接,所以它适用于前几行然后它崩溃出现致命错误,
致命错误:索引超出范围
它不会去catch或else
我也尝试过使用警卫,但也没有抛出
guard let name = row?.xpath("//td[2]//div//a[1]")[count] else{
throw MyError.FoundNil("name")
}
如果我需要检查 50 个表格单元格怎么办 我需要尝试一下吗?
【问题讨论】:
-
您无法在 Swift 中捕获“索引超出范围”或其他运行时错误,请比较 stackoverflow.com/questions/38737880/…。
-
问题是
fatal error: Index out of range也不例外,它只是简单的消息崩溃。这是Objective C/Swift 1 的产物,那些fatalError在stdlib 中无处不在,无法使用Swift 2+do/catch捕获。所以,欢迎来到iOS dev,你会经常看到这样的东西。 -
谢谢,这解释了很多...回到绘图板