在Swift中尝试捕获异常

mod*_*che 28 exception try-catch swift

是否有可能在Swift中捕获异常?给出以下代码:

NSException.raise(NSRangeException,
    format: "Now you've gone too far!",
    arguments: CVaListPointer(fromUnsafePointer: UnsafePointer()))
Run Code Online (Sandbox Code Playgroud)

是否可以防止异常崩溃整个程序?也就是说,Objective-C中Swift等效的是以下内容:

@try {
    [NSException raise:NSRangeException format:@"Now you've gone too far!"];
}
Run Code Online (Sandbox Code Playgroud)

man*_*lds 10

它没有异常处理,开发人员论坛中的讨论讨论了为什么会这样:

但请记住,Cocoa和Cocoa Touch传统上并不打算捕获异常; 他们打算让你不要让他们被抛在一起.应使用可选类型和inout NSError参数处理普通错误; 你应该通过编写更好的代码来解决导致断言失败的任何情况(这似乎是Swift中唯一的异常抛出机制).

  • 来自论坛的评论是错误的.基金会在许多需要*被捕获的地方抛出异常,以使程序正常运行.最好的例子是当NSFileHandle遇到管道损坏时写入NSFileHandle(例如,在客户端关闭连接后服务器写入连接).除了写入连接之外,没有其他方法可以检测到这种情况,这是一种有效的非致命场景.没有异常处理,Swift程序无法使用Cocoa API实现类似服务器的功能. (58认同)
  • 这是非常不幸的。我知道在 Objective-C 中从来没有真正鼓励过 try-catch,但目前没有办法对 Swift 代码是否抛出异常进行单元测试。`XCTAssertThrows` 在 `.swift` 测试中不可用,如果没有 try-catch,就无法编写涉及异常的通过测试。 (2认同)
  • Swift 2现在似乎有这个功能. (2认同)