throws关键字是对Swift最大的误解.考虑以下代码:
func myUsefulFunction() throws
Run Code Online (Sandbox Code Playgroud)
我们无法真正理解它会抛出什么样的错误.我们唯一知道的是它可能会引发一些错误.了解错误可能的唯一方法是查看文档或在运行时检查错误.
但这不是针对斯威夫特的本性吗?Swift具有强大的泛型和类型系统,可以使代码具有表现力,但感觉就好像throws完全相反,因为您无法从查看函数签名中获得有关错误的任何信息.
为什么会这样?或者我错过了重要的事情并误解了这个概念?
看起来Swift 2.0已经从传统的ObjC(NSError返回)和Swift 1.X(成功/失败选项)运行时错误处理的约定转变为看起来非常类似于Java/C#/ C++ /等语言中的异常处理的东西.
Apple传统上强调使用NSError而不是抛出NSException for runtime errors(与程序员错误相比),因为NSException堆栈展开可能会导致内存泄漏,默认的ObjC编译器设置.
然而,现在他们已经设计出一些与传统异常非常相似的东西.我的问题是:
除了命名法(错误与异常)和语法(do-catch,而不是try-catch,尝试在方法调用之前使用等)之外,Swift 2.0错误处理和传统异常处理之间是否存在任何真正的差异.