当前位置:  开发笔记 > 编程语言 > 正文

Swift 2.1 - 错误处理 - 不编译多个Catch

如何解决《Swift2.1-错误处理-不编译多个Catch》经验,为你挑选了1个好方法。

我有一个函数assignName(name :),它会抛出一个错误.当从具有多个catch的do块调用该函数时,它将错误显示为:

Errors thrown from here are not handled because the enclosing catch is not exhaustive 

我的代码是:

enum PersonError: ErrorType {
    case IsNotAPerson
    case IsNotAGoodPerson
    case IsNotAValidPerson
}

func assignName(name: String?) throws {
    guard name != nil else {
        throw PersonError.IsNotAPerson
    }
    personName = name
}
func catchingSpecificError() {
    do {
        try assignName(nil) // Compiler Error displays at this line.

    }catch PersonError.IsNotAPerson {
        print("Propagated error is caught in catch on case .NotAPerson")
    }     
}

提前致谢!



1> dfri..:

您需要包含一个默认的catch块(就像使用switch case一样),以使您的错误处理详尽无遗; 如果抛出的错误不是您指定的错误之一.

func catchingSpecificError() {
    do {
        try assignName(nil) // Compiler Error displays at this line.

    }catch PersonError.IsNotAPerson {
        print("Propagated error is caught in catch on case .NotAPerson")
    }catch {
        print("default..")
    }
}

稍微偏离主题,但我认为personName = name是指personName我们在上面的示例中看不到的类属性.


catch添加了默认块后,您在下面的注释中提到该函数catchingSpecificError()不会抛出您期望的错误; 或者更确切地说,默认catch块捕获您的错误.

现在,由于我不知道你的代码的上下文,我无法推断出你的情况实际上出了什么问题.我将在下面发布一个工作示例---在这个问题的上下文中 - 抛出和捕获按预期工作.但请注意,您对guard块的使用有点超出惯例.通常你guard只使用if let块,即,如果包含guard let name = name else { ..,将进入guard块.namenil

无论如何,请考虑以下完整工作示例:

enum PersonError: ErrorType {
    case IsNotAPerson
    case IsNotAGoodPerson
    case IsNotAValidPerson
}

class Person {
    var personName : String? = ""

    func assignName(name: String?) throws {
        guard name != nil else {
            throw PersonError.IsNotAPerson
        }

        personName = name
    }

    func catchingSpecificError() {
        do {
            try assignName(nil)

        }catch PersonError.IsNotAPerson {
            print("Propagated error is caught in catch on case .NotAPerson")
        }catch {
            print("default..")
        }
    }
}

var myPerson = Person()
var myName : String? = nil

myPerson.catchingSpecificError()
/* Prints: "Propagated error is caught in catch on case .NotAPerson" */

正如所料,我们抓住PersonError.IsNotAPerson功能抛出assignName.希望您可以使用这个示例,您可以获得自己的代码(您在问题中未显示的部分).

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有