swift - 对 Swift 3 中的错误处理感到困惑

标签 swift swift3 error-handling

我对 swift3 中的错误处理感到困惑。我尝试像“如果 XX 函数出错然后尝试 YY 函数”那样做 让我向您展示我的尝试:

    class MyClass {
      enum error: Error
      {
        case nilString
      }
      func findURL() {
            do {
                let opt = try HTTP.GET(url_adr!)
                opt.start { response in
                    if let err = response.error {
                        print("error: \(err.localizedDescription)")
                        return //also notify app of failure as needed
                    }
                    do
                    {
/* This is func1. and got error. I want to if this function has error then go next function. */
                            try self.stringOperation(data: response.description)
                        }
                        catch{
                            print("doesn't work on func1. trying 2nd func")
                          self.stringOperation2(data:response.descritption)
                        }

                    }
                } catch let error {
                    print("got an error creating the request: \(error)")
                }
         }
         func stringOperation(data:String)throws -> Bool{
                do{
/** 1 **/
                        if let _:String = try! data.substring(from: data.index(of: "var sources2")!){ 
                            print("its done")
                        }else{
                        throw error.nilString
             }

IN 1:我在这一行遇到了这个 fatal error : “ fatal error :在展开可选值时意外发现 nil”,程序崩溃。 我用谷歌搜索了错误处理,试图理解并应用到我的代码中。但是还没有成功。有人可以解释我哪里错了吗?

附加信息:我得到了 .substring(from:...) 和 .index(of:"str") 的字符串扩展名。所以这些行不会让您感到困惑。

最佳答案

作为一般规则,尽量避免使用强制解包(!),你有

if let _: String= try! data.substring...

改为使用

if let index = data.index(of: "var sources2"), 
    let _: String = try? data.substring(from: index) { ... } else { ... }

这样你就可以消除可能导致崩溃的两个力解包。您已经拥有用于捕获 nil 值的 if let 保护,因此您可以通过使用条件展开来充分利用它。

关于swift - 对 Swift 3 中的错误处理感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44997216/

相关文章:

ios - 如何在 Swift 中组合 2 个 CoreData 谓词?

swift - 没有更多上下文 Swift,表达式类型不明确

javascript - 没有错误时的错误处理?

iOS 主细节秒

arrays - Swift:二进制搜索标准数组?

ios - swift 3.0 : delay of less than a second

ios - 如何下载音频文件?

ios - 对同一个 ViewController 使用不同的 swift 文件?

security - 服务器抛出异常时如何避免用户收到 500 错误

django - 限制 Django 日志记录错误邮件在生产中不起作用