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