最近写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)
网友评论