在SWIFT中处理异常

时间:2019-01-23 12:56:08

标签: ios swift

无法以任何方式处理,程序一直崩溃。我附上我需要的例子!该解决方案不应包含具有 THROWS 的功能。 谢谢!

没有枚举!!!像Java一样简单!

// Array have two items and first item have Int
            // I need handle error in try / catch block
            //
            // WITHOUT OF FUNCTIONS!!!!!!!!!!!!!!!!!!!!
            //
            var list = [[100,nil], [nil, nil]]

            do {

                // OR HERE ERROR
                let index_0_value_1 :Int = list[0][0] as! Int

                // OR HERE ERROR
                let index_0_value_2 :Int = list[0][1] as! Int

                // OR HERE ERROR
                let index_1_value_1 :Int = list[1][0] as! Int

                // OR HERE ERROR
                let index_1_value_2 :Int = list[1][1] as! Int


            } catch {
                // Here ANY Exception
                ///  ANY ANY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // E     X   C    E    P   T    I    O    N
                // HERE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            }

1 个答案:

答案 0 :(得分:0)

不幸的是,Swift投掷捕捉系统的工作原理有所不同。它根本不是要捕获您的异常,而是使用不返回异常的方法来检索错误。考虑您有这样一种方法:

func generateMyList() -> [MyObject]?

这是一个非常简单的方法,但是假设有可能发生错误。或者更确切地说,我们也希望向开发人员提供错误反馈。为此,我们需要使用一个元组:

func generateMyList() -> (objects: [MyObject]?, error: Error?)

但这非常丑陋。所以我们宁愿有一个掷球接球系统。然后是

func generateMyList() throws -> [MyObject]?

现在,由于方法引发,我们需要在其上使用try。我们要么走很长的路:

let myItems: [MyObject]?
do {
    myItems = try generateMyList()
} catch {
    print(error) // we get a thrown error here
}

或简短版本:

let myItems: [MyObject]? = try? generateMyList()

通过这种方式,我们将忽略该错误,只说“做”或返回nil。

这就是swift中do-try-catch要做的所有事情。它不会处理所有异常。或更确切地说,它根本不会处理异常。

对于您的特定情况,没有办法抓住它。您可以有一种便捷的方法

func getInteger(column: Int, row: Int) throws -> Int {
    guard list.count > column else { throw NSError(domain: "internal", code: 404, userInfo: ["dev_message": "Column index out of bounds"]) }
    guard guard list[column].count > row else { throw NSError(domain: "internal", code: 404, userInfo: ["dev_message": "Row index out of bounds"]) }

    guard let integerValue = list[column][row] as? Int else { throw NSError(domain: "internal", code: 404, userInfo: ["dev_message": "Value at given column and row is not an integer"]) }

    return integerValue
}

现在您可以拨打电话

do {
    // OR HERE ERROR
    let index_0_value_1 :Int = try getInteger(column: 0, row: 0)

    // OR HERE ERROR
    let index_0_value_2 :Int = try getInteger(column: 0, row: 1)

    // OR HERE ERROR
    let index_1_value_1 :Int = try getInteger(column: 1, row: 0)

    // OR HERE ERROR
    let index_1_value_2 :Int = try getInteger(column: 1, row: 1)
} catch {
    print("Error: \((error as NSError).userInfo["dev_message"] as? String ?? "[Unknown error]")")
}

我希望这可以解决一些问题。让我们知道您是否还有其他问题。