Swift 尝试以正确的方式处理错误和选项

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

我正在尝试使用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.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's
Abort
?以及您的
notFound
错误将受益于字符串a意外值,它可以存储您的
“no src”
“no段落标记”
,等等。是的,这就成功了。我最好更深入地研究投球和防守…非常感谢你,这就成功了。我最好深入研究投掷和防守…非常感谢