Swift相关

swift 关于错误异常的处理

2020-03-31  本文已影响0人  Nulll

最近写swift遇到的一个小问题,已知也没有纪录一下。现在纪录一下遇到的在swift 上的异常处理报告。

1、关于可能会报错的函数

//普通函数
func getobjByArray<T>(array:[T], index:Int) -> T {
    let result = array[index]
    return result
}

上面的代码明显会发生错误,如果数组越界了怎么办,如果index小于0呢?
那么发生了错误要怎么处理呢。这时候可以定义一个带错误的返回。

//即在返回处添加一个 throws 
func getobjByArray<T>(array:[T], index:Int) throws -> T {
       guard index > 0 else {
            throw err
        }
        guard array.count > 0 else {
            throw arrayError.arrayIsEmpty
        }
        guard array.count > index else {
            throw arrayError.indexCrossBoard
        }
        let result = array[index]
        return result
}
enum arrayError:Error {
    case indexCrossBoard, indexLessZero, arrayIsEmpty
}

2、到了这里如果你在某个地方直接调用该函数是会发生错误的

 let v1 = self.getobjByArray(array: ["a","b","c"], index: 1)
//错误提示:Call can throw, but it is not marked with 'try' and the error is not handled

3、现在就到了怎么处理错误的方法了,关键字 try 来处理这样的错误

try : 标准的处理方式, 该方式必须结合do catch来处理
try? :函数回返回一个可选的值,如果可以返回。否则返回nil
try! :强制返回。这样如果是无返回那么回崩掉

try?的使用。 这个必须要配合 do-catch &try 使用

        do {
            let vv = try self.getobjByArray(array: [1,2,3], index: 2)
            print(vv)
        } catch let error {
            switch error {
            case arrayError.indexLessZero:
                print("一个已知的错误")
            default:
                print("未知错误")
            }
        }

try? 的使用,这里有两种处理方式

//a.guard try? ..这个是需要实现else 方法
        guard let v2 = try? self.getobjByArray(array: ["1",2,"3"], index: 1) else {
            return
        }
        print(value)
//b.if try? 。这个是处理有结果的返回
        if let v3 = try? self.getobjByArray(array: [1,2,3], index: 2) {
            print(vvv)
        }

try! 的使用

let v4 = try! self.getobjByArray(array: ["a","b","c"], index: 1)
        print("有可能回崩溃的" + v4)
上一篇下一篇

猜你喜欢

热点阅读