Swift的用户友好型错误消息

由Max Howell

无论您的代码多么出色,都会发生错误。 因此,良好的错误处理和消息传递对于完善的用户体验和使您的用户感到沮丧的应用程序至关重要。

NSError始终具有非常有用(且已翻译)的localizedDescription方法,该方法为您提供了有用的信息以呈现给用户。 如果错误严重困扰他们的需求,他们可以向您发送电子邮件,也可以将其发送给Google,或者自己弄清楚他们需要做什么。

那是因为可可错误。 苹果花时间使这些消息有用。 但是对于我们自己的错误,至少在Objective-C时代,很少有人愿意做Right Thing™:

  -(void)foo错误:(NSError **)错误{ 
如果(badThing){*错误= [NSError errorWithDomain:@“ TODOland”代码:1 userInfo:nil]; 返回}
// ...
}

Swift坚持要通过try对您的应用进行更强大的编码,并具有真正出色的基于enum的自定义错误,因此我们可以轻松,准确地指定错误条件:

 枚举AuthenticationError { 
大小写无效密码
案例鼠标无法加入我们的服务
}

专家提示:您可以在函数本地编写错误枚举。 这通常是获得良好错误消息的最佳方法,而不必考虑错误对于全局范围的含义。

不幸的是,这些错误的localizedDescription通常为“操作无法完成”:

这违反了我们的介绍:向用户提供了信息丰富且有用的错误消息。

因此,Codebase对Error产生了以下extension

因此, AuthenticationError.miceCannotJoinOurServicelegibleDescription描述为: "AuthenticationError.miceCannotJoinOurService"

显然,一个好的localizedDescription会更好。 为此,使您的Error符合LocalizedError并实现errorDescription 。 但是让我们面对现实吧,现在没有时间这样做,上面的代码示例是一个很好的权宜之计。

上面的代码段经过了实战测试,并且经过了严格的测试,更加努力:

  • 错误是来自Cocoa还是Swift枚举的NSError ? 弄清楚这一点是非常困难的:Swift在两个对象之间“有帮助地”架起了桥梁:( as? NSErroras? Error 总是正确的。我们还尝试了ObjC的isKindOfClass似乎可以工作一段时间,但是随后发现了Swift Error实例。 s变成了我们背后的NSError s,因此我们选择了上面的检查,这不是最安全的方法(长期使用的类名可能会更改),但是我们无法立即找到更好的方法,它也可以100%起作用。
  • 如果存在根本错误,并且根本错误消息不是这样,则获取该潜在错误:“该操作无法完成。” CloudKit错误通常掩埋在潜在错误中,因此您(没有我们的代码段!)实际显示的错误是不友好。

将我们的legibleDescription代码与以下函数配对,无论屏幕上发生什么情况,该函数都会尝试显示警报控制器。 是否曾经尝试过在另一个视图控制器过渡期间显示警报? 提示:失败,并显示控制台日志消息(这是我错过不推荐使用的UIAlertView类的原因之一),我们的alert()函数成功完成:

在这里,我们使用PromiseKit,以便可以选择对用户对警报控制器的解雇做出反应,并在需要时将其与其他异步系统轻松地链接起来。

上面的alert()还会记录发生错误的文件和行号,因此至少在调试时您可以找出源。

是否想从经验丰富的专业人士那里学习iOS开发并从教您的那些人那里获得有薪学徒呢? 从9月17日开始,在九周内申请到Codebase的iOS培训实验室,该实验室位于佐治亚州萨凡纳!