带抛出的函数不会通过执行trow退出函数

时间:2017-02-24 23:43:11

标签: swift error-handling

我有以下抛出函数:

func doSomething(_ myArray: [Int]) throws -> Int {

    if myArray.count == 0 {
        throw arrayErrors.empty
    }
    return myArray[0]
}

但是当数组等于0时,它将抛出错误,但它将继续执行返回空数组的函数。

当转到if语句时如何退出该函数?

2 个答案:

答案 0 :(得分:2)

抛出错误时,函数会返回。在操场上弹出这个并查看输出。

//: Playground - noun: a place where people can play

enum MyError: Error {
    case emptyArray
}

func doSomething<T>(_ array: [T]) throws -> T {
    guard !array.isEmpty else {
        throw MyError.emptyArray
    }

    return array[0]
}

do {
    let emptyArray: [Int] = []
    let x = try doSomething(emptyArray)
    print("x from emptyArray is \(x)")
} catch {
    print("error calling doSeomthing on emptyArray: \(error)")
}

do {
    let populatedArray = [1]
    let x = try doSomething(populatedArray)
    print("x from populatedArray is \(x)")
} catch {
    print("error calling doSeomthing on emptyArray: \(error)")
}

您将看到输出

error calling doSeomthing on emptyArray: emptyArray
x from populatedArray is 1

请注意,您没有看到print("x from emptyArray is \(x)")的输出,因为它从未被调用,因为throw结束了该函数的执行。您也可以确认这一点,因为guard语句需要退出函数。

另外,请注意,如果你想要一个数组中的第一个东西,你可以使用myArray.first返回T?,你可以处理nil情况而不必处理错误。例如:

//: Playground - noun: a place where people can play

let myArray = [1, 2, 3]

if let firstItem = myArray.first {
    print("the first item in myArray is \(firstItem)")
} else {
    print("myArray is empty")
}

let myEmptyArray: [Int] = []

if let firstItem = myEmptyArray.first {
    print("the first item in myEmptyArray is \(firstItem)")
} else {
    print("myEmptyArray is empty")
}

输出:

the first item in myArray is 1
myEmptyArray is empty

答案 1 :(得分:1)

您需要了解错误处理。如果您插入throws关键字,则任何调用它的人都需要使用do-catch语句,try?try!或继续传播它们。因此,如果抛出错误将会发生什么事情取决于调用者。

以下是一个例子:

do {
  try doSomething(foo)
} catch arrayErrors.empty {
  fatalError("Array is empty!")
}

Apple的error handling

文档

如果您想在到达if后退出,只需不要使用错误处理并在if中调用fatalError

if myArray.count = 0 {
  fatalError("Error happened")
}