Swift try catch详解

作者: _兜兜转转_ | 来源:发表于2019-04-26 14:52 被阅读35次

    catch捕捉,也是一个老话题了,我们看一下OC是怎么实现的。

    使用NSAssert不符合条件的主动崩溃

    - (void)check:(NSString *)name age:(NSInteger)age{
        NSAssert(name.length>0, @"name is nil");
        NSAssert(age>0 && age<120, @"age is outof rang 0...120");
    }
    

    还有另外一种被动报错,可以捕捉到catch中的

        @try {
            NSArray *list = @[];
            list[2];
        } @catch (NSException *exception) {
    //这里报错才会执行
            NSLog(@"%@",exception.description);
        } @finally {
            //这里一定会执行
        }
    

    实际输出是:但是不会崩溃。

     *** -[__NSArray0 objectAtIndex:]: index 2 beyond bounds for empty NSArray
    

    那么我们在看一下Swift中声明Error类型的用法:

    enum ErrorTest:Error {
        case nameVisiableError
        case ageError
        case heightError
        case nameLengthError
    }
    
    
    

    首先我们继承Error这个protocol,定义一下自己错误类型,后边可以根据自己的错误类型来判断是哪一种错误。
    然后实现抛出异常函数throws:

        func checkPerson(p:Person) throws -> String {
            guard p.age>0 && p.age<120 else {
                throw ErrorTest.ageError
            }
            guard p.name.count<10 && p.name.count>0 else {
                throw ErrorTest.nameVisiableError
            }
           return "success"
        }
    

    我们这边是使用throw ErrorTest.nameVisiableError来抛出不符合条件的异常情况,
    然后捕捉函数:

     let p2 = Person(age: 1000, name: "小明")
    
    do {
                try str = checkPerson(p: p2)
    //不报错 下边会输出,报错则不执行
    print(str)
            } catch  {
    //报错则执行相对应的错误类型
                switch error {
                case ErrorTest.ageError:print("ageError"); break
                case ErrorTest.nameLengthError:print("nameLengthError"); break
                case ErrorTest.nameVisiableError:print("nameLengthError"); break
                case ErrorTest.heightError:print("heightError"); break
                default:break
                }
            }
    

    定义一个年龄是1000的小明,年龄超出整除范围,实际输出是:

    ageError
    

    当然我们也可以在catch中做好错误记录或者弹框提示超出范围提示用户。

    try try?和try!

    这三个的区别:
    try:会执行函数之后抛出函数
    try?是选择类型的执行,当报错的时候,返回nil,不报错的时候返回正常的值
    try!是强制解包,当抛出异常的时候也解包,导致崩溃问题。

    再看另外一种Swift的实现方式:

        func checkPersonAssert(p:Person) -> Void {
            assert(p.age>0 || p.age<120, "age is our of rang\n")
    //报错则崩溃,并输出age is our of rang 。下边的代码不会执行
            assert(p.name.count>0, "name is out of rang\n")
    //报错则崩溃,并输出 name is out of rang
        }
    

    这种和OC其实一样,不符合条件的直接崩溃并输出信息。
    这种经常用于封装函数的必要条件的地方使用。

    报错和捕捉先说这么多,后边有发现更好的在补充。

    相关文章

      网友评论

        本文标题:Swift try catch详解

        本文链接:https://www.haomeiwen.com/subject/ijnfnqtx.html