[swift学习之九]异常处理

/*注意点:
 1:没有最后的catch{}还不行,报错.
 2:调用能够抛出异常的函数的时候,得加try关键字。并且如果出现异常了,后面的就不执行了,直接进catch,
    这个和别的语言一样~。
 3:函数后面得加throws关键字,否则不让抛出异常。
 4:try!这个东西得慎用,表示调用的是带抛出异常的函数,但一定不抛出异常。如果判断错误,出现异常就悲剧了~
 5:标记throws的函数,抛出什么异常都无所谓,不一样类型都可以。
 6:guard语法很特别,监测合法性,否则不往下执行。必须和else一起用。类似finally语法。
 7:defer这个玩意在playground里面不执行,在正式工程里面没问题。
 8:带附加数据的枚举异常,在catch的时候,得写附加值,比较能否catch到。
 9:catch ...{}不要异常对象,catch let a as ...捕获后面的类型对象,就是看是否能类型转换成功~
*/
enum ErrorOverFlow:ErrorType{
    case LowOverFlow(String,Int,Int)
    case HighOverFlow(String,Int,Int)
    case EmptyError(String)
    func Description() -> String {
        switch self {
        case .LowOverFlow(let text, let minIndex, let CurrIndex):
            return "\(text)Min:\(minIndex) currIndex:\(CurrIndex)"
        case .HighOverFlow(let text, let maxIndex, let CurrIndex):
            return "\(text)Max:\(maxIndex) currIndex:\(CurrIndex)"
        case .EmptyError(let text):
            return "\(text)"
        }
    }
}

enum ErrorIntValue:ErrorType{
    case MaxValue(String,Int,Int)
    case MinValue(String,Int,Int)
    func Description() -> String {
        switch self {
        case .MinValue(let text, let minIndex, let CurrIndex):
            return "\(text)Min:\(minIndex) currValue:\(CurrIndex)"
        case .MaxValue(let text, let maxIndex, let CurrIndex):
            return "\(text)Max:\(maxIndex) currValue:\(CurrIndex)"
        }
    }
}

class ErrorMustSix:NSError{
    
}
func GetValueByIndex(aArray: [Int], aIndex:Int) throws->Int  {
    guard !aArray.isEmpty else {
       throw ErrorOverFlow.EmptyError("访问的数组内容为空")
    }
    guard aIndex < aArray.count else{
        throw ErrorOverFlow.HighOverFlow("上标越界", aArray.count, aIndex)
    }
    guard aIndex >= 0 else{
        throw ErrorOverFlow.LowOverFlow("下标越界", aArray.count, aIndex)
    }
    let rResult = aArray[aIndex]
    guard rResult < 10 else{
        throw ErrorIntValue.MaxValue("值太大", 10, rResult)
    }
    guard rResult > 1 else{
        throw ErrorIntValue.MinValue("值太小", 1, rResult)
    }
    guard rResult > 5 else {
        throw NSError(domain: "不能小于5啊!~", code: 5, userInfo: nil)
    }
    guard rResult < 7 else {
        throw ErrorMustSix(domain: "不能大于7啊!~", code: 5, userInfo: nil)
    }
    return rResult
}
func CatchThrow() -> Void {
    defer{
        print("收尾了")
    }
    do{
       let rResult = try GetValueByIndex([1,2,6],aIndex: 2)
       print(rResult)
    }
    catch ErrorOverFlow.LowOverFlow("下标越界", 2, -1){
        print("a")
    }
    catch let e as ErrorOverFlow  {
        print(e.Description())
    }
    catch let e as ErrorIntValue{
        print(e.Description())
    }
    catch let e as ErrorMustSix{
        print(e)
    }
    catch let e as NSError{
        print(e)
    }
    catch{
        
    }
}
CatchThrow()
参考:http://www.swiftvip.cn/guide/chapter2/18_Error_Handling.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值