【问题标题】:Catch "IndexOutOfBoundsException" in Swift 2在 Swift 2 中捕获“IndexOutOfBoundsException”
【发布时间】:2015-11-28 06:09:28
【问题描述】:

我在 Playground 中获得了此代码:

func throwsError() throws{
    var x = [1,2]
    print(x[3])
}

func start(){

    do{
        try throwsError()

    }
    catch let unknown{
        "unknown: \(unknown)"
    }
}

start()

那么显然'throwsError 函数会抛出错误:

执行被中断,原因:EXC_BAD_INSTRUCTION

有没有办法捕捉到这个? 我在线阅读为始终检查范围但问题更大的 Array 类编写下标: 难道我什么都抓不到吗?

【问题讨论】:

  • 异常和错误是不同的东西,你不能在 Swift 中捕获异常。
  • 如果我们可以编写错误处理程序,就像我们可以编写完成处理程序并让它们与 do try catch 方法一起工作,那将会很棒。
  • 我想你可以:apple doc
  • 我们从 Obj-C 知道的异常捕获从未奏效。它与 C++ 中存在相同的问题,通常会留下大量内存而没有释放,并且大量内部状态已损坏。例如,任何通过 Cocoa/CocoaTouch API 的异常都会破坏应用程序 UI。这就是为什么Apple一直强烈反对使用异常并开始使用NSErrors的原因。不要试图捕捉异常。如果遇到异常,请查找原因并解决。不要抓住它。 Swift 无法捕获异常。

标签: ios swift exception error-handling swift2


【解决方案1】:

您可以编写自己的方法。不是很优雅,但很有效。

enum ArrayError: ErrorType {
    case OutOfBounds(min: Int, max: Int)
}

extension Array {

    mutating func safeAssign(index:Int, value: Element) throws {

        guard self.count > index && index >= 0 else {
            throw ArrayError.OutOfBounds(min: 0, max: (self.count - 1))
        }

        self[index] = value

    }
}

var myArray : [Float] = [1,2]

do {
    try myArray.safeAssign(1, value: Float(5))
} catch ArrayError.OutOfBounds(let min, let max) {
    print("out of bounds : \(min) => \(max)")
}

【讨论】:

  • 虽然这对我的具体情况有所帮助,但我对捕获异常的一般问题更感兴趣:)
  • 没看到 :) 无论如何,你可以像上面那样为所有异常编写错误处理程序:D
【解决方案2】:

在 Swift 中,你不能catch 任何东西。您只能捕获在其他 Swift 代码中使用throw 语句抛出的错误,或者由调用的Objective C 代码设置的NSError 类型的错误。

默认数组下标会引发异常,但不会throw Swift 错误,因此您不能对其使用try/catch。

另请参阅 Erica Sadun 的 this article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2016-05-11
    • 2019-10-29
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多