swift - Swift 2.0 中的异常(exception)。为什么是 'do' ?

标签 swift

我很好奇为什么 Swift 语言工程师决定使用这种语法:

do {
  let x = try statement that throws
  try a void statement that throws
} catch {
}

与更传统的 try-catch 语法相比,它的作用似乎完全相同。但在 Swift 中,需要为抛出异常的每一行键入一个 try。

最佳答案

他们想要使用 try 调用每个可能抛出的特定表达式。我想原因是,关于异常的一个常见提示是它们是“隐形的 goto”,用户如果不查看他们正在使用的每个函数的定义,就无法知道将抛出什么。在每次抛出函数调用时都需要 try 来消除这个问题。

我个人认为“看不见的 goto”是一个有效的提示。异常远非非结构化(如goto),而是使错误处理高度结构化。此外,如果您正确使用异常,您几乎不需要一眼就能看出函数抛出了什么。欲了解更多信息,请参阅http://exceptionsafecode.com ,其中详细讨论了异常的正确使用。

鉴于他们希望 try 成为抛出函数调用的显式调用,他们可能不想将其重用于传统的 try block 语法。

他们也可能只是不使用任何关键字:

{
  let x = try foo()
} catch {
  // ...
}

他们还使用 do 来引入任意嵌套范围:

do {
  let x = foo()
}

其他语言已经使用大括号而不使用任何关键字。想必他们觉得拥有关键字可以使语法更易于阅读或解析等。

关于swift - Swift 2.0 中的异常(exception)。为什么是 'do' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30771683/

相关文章:

objective-c - 在 RNFIRMessaging.h 中找不到“FirebaseCore/FirebaseCore.h”文件

arrays - swift 3 : binary operator cannot be applied to operands of type int and 'Int?'

ios - UIImagePickerController 在 Swift 3 的图像编辑模式下更改底部栏按钮标题

ios - CGContext 初始化后不绘制

ios - 单击 Pin 以转到另一个 ViewController

ios - Swift Metal Compute Shaders 提供意想不到的混合结果

ios - 在 Touches 中获取 SKSpriteNode 的属性

ios - TableView 多单元格不起作用,由于信号 9 而终止

swift - 如何实现 uisearchcontroller 通过 post 请求从服务器端检索数据

ios - 如何在 Swift 中获取相对于 UIWindow 的 UIBarButtonItem 的框架?