如何获得 Swift 2.0 中的错误消息?
How do I get the error message in Swift 2.0?
我在 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,然后是它的描述属性,但现在我一点头绪都没有了。
使用自动 error
变量,如果您愿意,可以将其转换为 NSError
:
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
您现在可以抛出继承 ErrorType
的任何对象,并在 catch
语句中提供自定义处理。您还可以将错误转换为 NSError
以访问 localizedDescription
以处理第三方错误。
转换枚举 ErrorType
将生成一个 NSError
,其中 domain
等于枚举名称,code
等于枚举值和一个自动生成的 localizedDescription
格式如下:
The operation couldn’t be completed. (DOMAIN error CODE.)
例如下面的代码:
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)
}
将打印
The operation couldn’t be completed. (AwfulError error 1.)
尽管问题标题指定 Swift 2,但此答案针对 Swift 3。
正如@redent84 指出的那样,由于 Swift 2 错误 object 可能是 home-made 错误。这是我编写的用于分析和打印 "catch" 语句中可用的默认错误 object 的方法,该语句未指定任何特定的错误类型:
// 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)
}
如何获取 userInfo 中的错误 message:
let errorMessage = (error as NSError).userInfo["message"] as? String
我在 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,然后是它的描述属性,但现在我一点头绪都没有了。
使用自动 error
变量,如果您愿意,可以将其转换为 NSError
:
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
您现在可以抛出继承 ErrorType
的任何对象,并在 catch
语句中提供自定义处理。您还可以将错误转换为 NSError
以访问 localizedDescription
以处理第三方错误。
转换枚举 ErrorType
将生成一个 NSError
,其中 domain
等于枚举名称,code
等于枚举值和一个自动生成的 localizedDescription
格式如下:
The operation couldn’t be completed. (DOMAIN error CODE.)
例如下面的代码:
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)
}
将打印
The operation couldn’t be completed. (AwfulError error 1.)
尽管问题标题指定 Swift 2,但此答案针对 Swift 3。
正如@redent84 指出的那样,由于 Swift 2 错误 object 可能是 home-made 错误。这是我编写的用于分析和打印 "catch" 语句中可用的默认错误 object 的方法,该语句未指定任何特定的错误类型:
// 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)
}
如何获取 userInfo 中的错误 message:
let errorMessage = (error as NSError).userInfo["message"] as? String