Swift 中的异常处理(附带与OC的对比)

1.用assert和precondition的方式来抛出错误信息

Swift中的assert的使用与OC中的NSAssert相似git

oc中的用法
- (void)assertfunction:(NSString *)email password :(NSString *)password {
    NSAssert(email.length < 8, @"invalid email");
    NSAssert(password.length < 8, @"invalid password");
}

复制代码
swift中的用法
func assertfunction(email: String ,password: String) {
    assert(email.count < 8, "invalid email")
    assert(password.count < 8, "invalid password")
}
复制代码

precondition为Swift独有(OC没有),使用方式与assert同样,第一个参数填写判断的条件第二个是messagegithub

precondition(condition: Bool, message: String)
复制代码

Swift中precondition的做用与assert相似,最大的区别在于assert只能在debug模式下使用,而precondition在debug模式和Release模式下都可以起做用.swift

2. 使用try catch处理异常

先看一下OC中的try catchbash

- (void)trycatchfunction {
    @try {
        NSArray<NSString*> *list = @[];
        NSLog(@"list[1]===%@",list[1]);
    } @catch (NSException *exception) {
        NSLog(@"%@",exception.description);
    } @finally {
        
    }
}
复制代码

oc中的try catch,会将try中的异常捕获,而后会执行catch中的代码,Swift中的try catch步骤要多一些分为三步网络

1. 使用枚举定义异常值

enum RequestError :Error {//注意Swift的全部异常类型都继承于Error。
    case netError
    case serviceError
    case missingParameter(parameter: String)
    case isnil
}
复制代码

2. 抛出异常

func throwErrors(type :Int) throws -> String {//(使用关键字throws)
    if type == 1 {
        throw RequestError.netError
    }else if type == 2 {
        throw RequestError.serviceError
    }else if type == 3 {
        throw RequestError.missingParameter(parameter: "password")
    }
    return "success"
}
复制代码

3.捕获异常(catch)

do {
    try str = throwErrors(type: 2)
    
    //不报错 下边会输出,报错则不执行
    print(str)
    // let array : [Int] = []
    // 若是执行 print(array[2])程序会崩溃,swift中的try catch 只能捕获事先定义好的异常,这点与OC有很大不一样
} catch  {
    //报错则执行相对应的错误类型
    
    switch error {//这里要特别说明一下swift的error是异常,与OC中的NSError不是一回事,与OC中的NSException类似
    case RequestError.netError :
        print("是网络错误")
    case RequestError.serviceError :
        print("是服务端错误")
    default:
        print("缺乏参数")
    }
}
复制代码

固然发现有异常,你也能够选择不处理函数

func findOptionsError(value :String?) throws -> [String] {
    guard let value = value else {
        throw RequestError.isnil
    }
    return [value]
}

let value = try? findOptionsError(value: nil)//此处异常会返回一个nil


let crash = try! findOptionsError(value: nil)//此处会崩溃
复制代码

try try? try!的区别 try : 执行函数后,若是有异常须要catch异常ui

try? :是可选性的执行,不报错的时候返回正常的值.若是有异常会返回一个nil,程序不会奔溃.spa

try! :是强制解包,当抛出异常的时候也解包,致使崩溃问题。.net

相关的swift 代码在 这里.若是有疑问能够看一下.debug

iOS的报错和捕获异常先说这么多,若是有错误但愿你们指出.欢迎评论.

相关文章
相关标签/搜索