【问题标题】:try-catch exceptions in Swift [duplicate]Swift 中的 try-catch 异常 [重复]
【发布时间】:2014-07-24 06:11:19
【问题描述】:

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

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

是否可以防止异常使整个程序崩溃?也就是说,Objective-C 中的 Swift 等价物是什么:

@try {
    [NSException raise:NSRangeException format:@"Now you've gone too far!"];
}

【问题讨论】:

标签: exception try-catch swift


【解决方案1】:

我相信,截至今天,Swift 不支持这一点。它很可能会添加到未来的测试版中。

【讨论】:

  • 你有什么数据可以备份你的最后一句话吗,还是有预感?
  • 我的回答基于 manjolds 在此处发布的相同文档:stackoverflow.com/a/24023248/1011787Cocoa and CocoaTouch traditionally don't intend for you to catch exceptions,但它们仍然受支持。这就是我说“最有可能”的原因——即使他们不鼓励使用,他们仍然提供这种选择。
  • 可能,您假设 “它很可能会添加到未来的测试版中。” 根据官方文档是不正确的,因为他们清楚地表明它不会将来也会发生。你可以在 Swift 中抛出异常,但它不能在运行时被捕获,因此这些总是严重的异常。
  • 这不再正确,您可能需要更新您的答案以获取可能的选票
【解决方案2】:

没有异常处理,and this discussion in the developer forum discusses why it may be so:

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

【讨论】:

  • 这很不幸。我知道在 Objective-C 中从来没有真正鼓励过 try-catch,但目前没有办法对 Swift 代码是否抛出异常进行单元测试。 XCTAssertThrows.swift 测试中不可用,并且没有 try-catch,就无法编写包含异常的通过测试。
  • 论坛的评论是错误的。 Foundation 在许多需要捕获程序才能正常运行的地方抛出异常。最好的例子是当 NSFileHandle 遇到损坏的管道时写入 NSFileHandle(例如,在客户端关闭连接后服务器写入连接)。除了写入连接之外,没有其他方法可以检测到这种情况,这是一种有效的、非致命的情况。如果没有异常处理,Swift 程序就无法使用 Cocoa API 实现类似服务器的功能。
  • 我发现从 API 抛出错误非常令人不安,并且不要让 swift 语言处理它们。我只是经历了这种情况,真的不欣赏它。很抱歉没有建设性,但有些话需要说
  • Swift 2 现在似乎具有此功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2013-05-26
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多