抓住任何错误,特别是在swift中意外发现nil

Moh*_*iba 6 swift

我怎么能捕获任何错误,我的意思是任何类型,包括致命错误,异常,任何类型......
在其他语言中我们会使用try,catch,但是当它包装nil值时,do,catch不会有效.但为什么?真的为什么?

kel*_*lin 7

如果我需要解包许多可选值,例如在处理Any值集合时,编写多个guard letif let语句并不方便.相反,我使用的do-try-catch处理nil.要实现这一点,我正在使用这个简单的unwrap代码段:

public struct UnwrapError<T> : Error, CustomStringConvertible {
    let optional: T?

    public var description: String {
        return "Found nil while unwrapping \(String(describing: optional))!"
    }
}


func unwrap<T>(_ optional: T?) throws -> T {
    if let real = optional {
        return real
    } else {
        throw UnwrapError(optional: optional)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

do {
    isAdsEnabled = try unwrap(dictionary["isAdsEnabled"] as? Bool)
    // Unwrap other values...
} catch _ {
    return nil
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

不幸的是,这并不迅速。

您可以捕获由以下函数引发的错误:

do {
   let outcome = try myThrowingFunction()
} catch Error.SomeError {
   //do stuff
} catch {
  // other errors
}
Run Code Online (Sandbox Code Playgroud)

或忽略引发的错误,然后像这样继续:

let outcome = try? myThrowingFunction()
Run Code Online (Sandbox Code Playgroud)

但是无法捕捉到意外的崩溃

  • 好吧,但这应该是可能的吧?我的意思是,任何语言都有这种东西,这是一个预期的、必要的功能吗?正确的?否则我到底怎么会得到这些错误呢? (2认同)
  • 是的,应该。是的。您应该通过使用`if let`,`guard`和其他几种技术以一种防御性的方式进行编程,从而避免崩溃的发生(显然,在现实世界中这绝不会真正发生,只有在没有战争,暴力,金钱或[律师](https://www.youtube.com/watch?v=m2VxpTMAbas)) (2认同)

Cha*_*lva 3

您可以使用 do-catch 语句通过运行代码块来处理错误。如果 do 子句中的代码抛出错误,则会将其与 catch 子句进行匹配,以确定哪一个子句可以处理该错误。

你用试试?通过将错误转换为可选值来处理错误。如果在评估 try 时抛出错误?表达式,表达式的值为 nil。例如,在以下代码中,x 和 y 具有相同的值和行为:

func someThrowingFunction() throws -> Int {
    // ...
}

let myValue1 = try? someThrowingFunction()

let myValue2: Int?
do {
    myValue2 = try someThrowingFunction()
} catch {
    myValue2 = nil
}
Run Code Online (Sandbox Code Playgroud)

如果 someThrowingFunction() 抛出错误,则 myValue1 和 myValue2 的值为 nil。否则,myValue1 和 myValue2 的值是函数返回的值。请注意,myValue1 和 myValue2 是 someThrowingFunction() 返回的任何类型的可选值。这里函数返回一个整数,因此 myValue1 和 myValue2 是可选整数。

使用尝试?当您想以相同的方式处理所有错误时,可以让您编写简洁的错误处理代码。例如,以下代码使用多种方法来获取数据,如果所有方法都失败则返回 nil

func fetchData() -> Data? {
    if let data = try? fetchDataFromDisk() { return data }
    if let data = try? fetchDataFromServer() { return data }
 return nil
}
Run Code Online (Sandbox Code Playgroud)

如果你想检查 nil 值,你也可以这样使用:-

var myValue: Int?


if let checkValue:Int = myValue {
  // run this when checkValue has a value which is not ni
}  
Run Code Online (Sandbox Code Playgroud)