Swift 2:从抛出函数类型转换为非抛出函数无效。

17

我有一些(丑陋的)自编代码,已经转换为Swift2,并在lambda函数中收到了以下错误信息:

带错误的函数

我不明白的是,我使用错误抛出函数JSONObjectWithData处理整个代码并捕获错误,代码中没有任何抛出。尽管如此,编译器认为我正在抛出一个错误。

我需要理解这种行为。请友好一点,因为我知道我必须改进我的代码才能充分利用Swift2中的新错误处理概念。

非常感谢您提前的帮助。

2个回答

38

很快就解决了我的问题。在这篇文章的帮助下,我找到了解决方案:

http://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

由于单独使用NSError的catch是不够的,所以你必须在代码末尾放置一个通用的catch子句。

catch let error as NSError
{
   failure(error: error)
   return
}

// this is important -->
catch
{
}

你认为为什么苹果在Swift 2中将catch设置为穷尽的,而在Swift 1 / 1.2中我们甚至没有trycatch - rb612
1
你不需要特别捕获错误。在通用的捕获块中应该有一个错误引用可用。 - Jon Shier
1
嗨Jon,你能给我一个例子吗?我该如何在通用catch块中使用错误引用?谢谢。 - ChaosSpeeder
1
这并没有帮助我。我仍然收到错误信息:“从抛出函数类型 '() throws -> ()' 到非抛出函数类型 '() -> Void' 的无效转换”。 - shrutim
我们需要这样做是有充分的理由的:如果抛出的错误与你预期的错误不同,你仍然可以捕捉到它。有关更多信息,请参见this回答中的注释。比如说你期望的错误类型是BadNetworkError,但是突然出现了LowMemoryError,使用普通的catch也能救你! - mfaani
同样适用于Swift 3。 - chengsam

3

我认为向前迈进的最好方式是将您的失败函数签名更改为接受ErrorType参数。然后只需要

catch let error {
    failure(error: error)
}

我会的。

在使用苹果 API 时,最好将错误转换为 NSError,因为苹果方法往往会抛出 NSError 对象。苹果的 NSError 对象包含有关发生错误的其他详细信息,可通过 NSError 特定的属性(如 .localizedDescription 和 .userInfo)访问。原帖中的 "JSONObjectWithData" 抛出 NSError 对象。CoreData 方法也会抛出 NSError 对象。我喜欢在 catch 块内部将错误转换为 NSError,以便 catch 是全面的。 - ObjectiveTC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接