我在Swift 1.2中使用了这个方法:NSURLConnection.sendSynchronousRequest(:_:_:_)
但在iOS9中显然已经弃用了。它仍然有效,但现在它使用新的Swift 2.0错误处理,我不知道如果它失败,我将如何得到错误消息,例如。如果时间用完了。
我知道我必须将它放入do-catch然后在方法之前说尝试但我不知道如何捕获错误消息。
do {
let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
return data
}
catch _ {
return nil
}
在我使用NSError然后使用它的描述属性之前,但现在我没有任何线索。
答案 0 :(得分:36)
使用自动error
变量,如果您愿意,可以将其投射到NSError
:
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
答案 1 :(得分:4)
您现在可以抛出任何继承ErrorType
的对象,并在catch
句子中提供自定义处理。您还可以将错误转换为NSError
以访问localizedDescription
以处理第三方错误。
投放枚举ErrorType
将生成NSError
domain
等于枚举名称,code
等于枚举值和自动生成的localizedDescription
使用以下格式:
无法完成操作。 (DOMAIN错误代码。)
例如,以下代码:
enum AwfulError: ErrorType {
case Bad
case Worse
case Terrible
}
func throwingFunction() throws {
throw AwfulError.Worse
}
do {
try throwingFunction()
}
catch AwfulError.Bad {
print("Bad error")
}
catch let error as NSError {
print(error.localizedDescription)
}
将打印
无法完成操作。 (AwfulError错误1。)
答案 2 :(得分:1)
尽管标题指定了Swift 2,但这个答案适用于Swift 3。
正如@ redent84所指出的,自Swift 2以来,一个Error对象可能是一个自制的。这是我编写的一种方法,用于分析和打印" catch"中可用的默认错误对象。没有指定任何特定错误类型的语句:
// Method to print an unknown Error type object to the system output.
static func printCaughtError(_ unknownError : Error) {
let objectDescription = String(describing: unknownError)
let localizedDescription = unknownError.localizedDescription
if localizedDescription != "" {
if localizedDescription.contains(objectDescription) {
print(localizedDescription)
return
}
if !objectDescription.contains(localizedDescription) {
print(objectDescription + ": " + localizedDescription)
return
}
}
print(objectDescription)
}
然后你可以这样称呼它:
catch {
printCaughtError(error)
}