我有一个函数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") } }
提前致谢!
您需要包含一个默认的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
块.name
nil
无论如何,请考虑以下完整工作示例:
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
.希望您可以使用这个示例,您可以获得自己的代码(您在问题中未显示的部分).