Swift 中的 CFNetwork 错误处理
CFNetwork error handling in Swift
我有一个 objective-c 代码块,负责通过检查 NSError
代码错误来处理 HTTP 错误。该代码将错误消息发送回委托(除非它是应用忽略的错误代码,例如已取消的请求)
failure:^(NSURLSessionTask *task, NSError *error, id responseObject) {
NSString *errorMessage = [self getErrorMessage:responseObject withError:error];
if (error.code!=kCFURLErrorCancelled &&
error.code!=kCFURLErrorCannotFindHost &&
error.code!=kCFURLErrorCannotConnectToHost &&
error.code!=kCFURLErrorNetworkConnectionLost &&
error.code!=kCFURLErrorDNSLookupFailed &&
error.code!=kCFURLErrorNotConnectedToInternet &&
error.code!=kCFURLErrorTimedOut) {
if ([self.delegate respondsToSelector:@selector(didFailed:)]) {
[self.delegate didFailed:errorMessage];
}
}
if (completionBlock != nil) completionBlock(NO);
}];
我有几个与此代码块相关的问题。
- 只检查错误代码就足够了吗?我使用的框架可能 return 不同类型的错误,我不确定这些错误代码是否唯一。
- 我要如何在 Swift 中编写相同的代码?我确实在
CFNetworkErrors
枚举下找到了错误代码定义。但是,error.code
和 CFNetworkErrors
枚举中的值不能直接比较,因为它们具有不同的类型。是否可以将 error.code
转换为 CFNetworkErrors
然后比较错误代码?
- 我可以安全地切换到使用
NSURL
错误,例如 NSURLErrorCancelled
吗? CFNetworks 错误和 NSURL 错误之间是否存在一对一的映射?
检查错误代码可能还不够。您几乎肯定还需要检查 HTTP 状态代码,除非您调用的委托方法已经这样做了。 NSError 通常会告诉您传输级故障,而状态代码会告诉您服务器端故障,例如文件不存在。
不知道。这个问题大多与网络无关,所以你应该问一个单独的问题,并将其标记为 Swift 问题。 :-)
是的,你应该使用基金会代码。这些值应该始终相同,但未来可能会有比 CF 代码更多的 Foundation 错误代码,因为并非所有 Foundation 级功能都在 CF 层公开公开。
我有一个 objective-c 代码块,负责通过检查 NSError
代码错误来处理 HTTP 错误。该代码将错误消息发送回委托(除非它是应用忽略的错误代码,例如已取消的请求)
failure:^(NSURLSessionTask *task, NSError *error, id responseObject) {
NSString *errorMessage = [self getErrorMessage:responseObject withError:error];
if (error.code!=kCFURLErrorCancelled &&
error.code!=kCFURLErrorCannotFindHost &&
error.code!=kCFURLErrorCannotConnectToHost &&
error.code!=kCFURLErrorNetworkConnectionLost &&
error.code!=kCFURLErrorDNSLookupFailed &&
error.code!=kCFURLErrorNotConnectedToInternet &&
error.code!=kCFURLErrorTimedOut) {
if ([self.delegate respondsToSelector:@selector(didFailed:)]) {
[self.delegate didFailed:errorMessage];
}
}
if (completionBlock != nil) completionBlock(NO);
}];
我有几个与此代码块相关的问题。
- 只检查错误代码就足够了吗?我使用的框架可能 return 不同类型的错误,我不确定这些错误代码是否唯一。
- 我要如何在 Swift 中编写相同的代码?我确实在
CFNetworkErrors
枚举下找到了错误代码定义。但是,error.code
和CFNetworkErrors
枚举中的值不能直接比较,因为它们具有不同的类型。是否可以将error.code
转换为CFNetworkErrors
然后比较错误代码? - 我可以安全地切换到使用
NSURL
错误,例如NSURLErrorCancelled
吗? CFNetworks 错误和 NSURL 错误之间是否存在一对一的映射?
检查错误代码可能还不够。您几乎肯定还需要检查 HTTP 状态代码,除非您调用的委托方法已经这样做了。 NSError 通常会告诉您传输级故障,而状态代码会告诉您服务器端故障,例如文件不存在。
不知道。这个问题大多与网络无关,所以你应该问一个单独的问题,并将其标记为 Swift 问题。 :-)
是的,你应该使用基金会代码。这些值应该始终相同,但未来可能会有比 CF 代码更多的 Foundation 错误代码,因为并非所有 Foundation 级功能都在 CF 层公开公开。