Swift 尝试以正确的方式处理错误和选项
我正在尝试使用SwiftSoup来获取一些HTML。此示例基于SwiftsoupGithub文档,运行良好Swift 尝试以正确的方式处理错误和选项,swift,error-handling,optional,swiftsoup,Swift,Error Handling,Optional,Swiftsoup,我正在尝试使用SwiftSoup来获取一些HTML。此示例基于SwiftsoupGithub文档,运行良好 func scrape() throws { do { let htmlFromSomeSource = "<html><body><p class="nerp">HerpDerp</p><p class="narf">HoopDoop</p>" let doc = try! SwiftSoup
func scrape() throws {
do {
let htmlFromSomeSource = "<html><body><p class="nerp">HerpDerp</p><p class="narf">HoopDoop</p>"
let doc = try! SwiftSoup.parse(htmlFromSomeSource)
let tag = try! doc.select("p").first()!
let tagClass = try! tag.attr("class")
} catch {
print("oh dang")
throw Abort(.notFound)
}
print(tagClass)
}
。。。但是,如果我弄乱了选择器或属性,它会崩溃,“在展开可选值时意外地发现了nil”(在“有文档吗?”)之后)。我以为警卫遇到零时会停止进程?(如果我将“try?”转换为“try”,编译器会抱怨“条件绑定的初始值设定项必须具有可选类型”…)如果将函数声明为
throws
,则在函数中不需要do-catch
块。只需删除之后的块和感叹号,然后尝试将错误传递给调用方函数
func scrape() throws { // add a return type
let htmlFromSomeSource = "<html><body><p class="nerp">HerpDerp</p><p class="narf">HoopDoop</p>"
let doc = try SwiftSoup.parse(htmlFromSomeSource)
guard let tag = try doc.select("p").first() else { throw Abort(.notFound) }
let tagClass = try tag.attr("class")
// return something
}
func scrap()抛出{//添加返回类型
让HTMLFromomeSource=“HerpDerp
HoopDoop
”
let doc=尝试SwiftSoup.parse(htmlFromSomeSource)
guard let tag=try doc.select(“p”).first()否则{throw Abort(.notFound)}
让tagClass=try tag.attr(“类”)
//归还某物
}
如果将函数声明为抛出
,则不需要在函数中使用do-catch
块。只需删除之后的块和感叹号,然后尝试将错误传递给调用方函数
func scrape() throws { // add a return type
let htmlFromSomeSource = "<html><body><p class="nerp">HerpDerp</p><p class="narf">HoopDoop</p>"
let doc = try SwiftSoup.parse(htmlFromSomeSource)
guard let tag = try doc.select("p").first() else { throw Abort(.notFound) }
let tagClass = try tag.attr("class")
// return something
}
func scrap()抛出{//添加返回类型
让HTMLFromomeSource=“HerpDerp
HoopDoop
”
let doc=尝试SwiftSoup.parse(htmlFromSomeSource)
guard let tag=try doc.select(“p”).first()否则{throw Abort(.notFound)}
让tagClass=try tag.attr(“类”)
//归还某物
}
“我以为guard在遇到nil时会停止进程?”不,展开nil
不是抛出的错误,而是一个例外。不过,您会在哪一行崩溃?你可以在说的任何时候打开nil
代码>(感叹号)。所以要么崩溃在first()上代码>或是由于您未向我们显示的隐式展开的可选项。请显示足够的代码以允许我们复制。您是正确的,它在“应该停止,因为没有img”之后崩溃了。什么是中止
?您的notFound
错误将受益于使用字符串a意外值,它可以存储您的“no src”
,“no段落标记”
,等等。“我以为guard在遇到nil时会停止进程?”不,展开nil
不是抛出的错误,这是一个例外。但是,你到底在哪一行崩溃?你可以在任何时候说!
(感叹号)来展开nil
。所以要么崩溃在第一行()!
或者这是由于您没有向我们显示隐式展开的可选代码。请显示足够的代码以允许我们复制。您是正确的,它在“应该停止,因为没有img”之后崩溃“.What'sAbort
?以及您的notFound
错误将受益于字符串a意外值,它可以存储您的“no src”
,“no段落标记”
,等等。是的,这就成功了。我最好更深入地研究投球和防守…非常感谢你,这就成功了。我最好深入研究投掷和防守…非常感谢