swift - URLsession .failure 使应用程序崩溃,因为错误为零
问题描述
当我有状态代码 500 时,我试图抛出一个错误。当我点击这一行完成时(.failure(错误!))我有“致命错误:在展开可选值时意外发现 nil”是我的问题URL 会话功能?
func PutRoleLedgerTransaction_DebitDistributorBalance(...,completion: @escaping (Result<Data, Error>) -> Void){
let jsonData = role_ledger_object.data(using: .utf8)
let componentURL = createURLComponents(path: "")
print(componentURL.url!)
guard let validURL = componentURL.url else {
print("URL creation failed...")
return
}
var request = URLRequest(url:validURL)
request.setValue("application/json", forHTTPHeaderField: "Content-Type" )
request.setValue("application/json", forHTTPHeaderField: "Accept" )
request.httpMethod = "PUT"
request.httpBody = jsonData
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let httpResponse = response as? HTTPURLResponse {
print("PutRoleLedgerTransaction API status: \(httpResponse.statusCode)")
let message: String = HTTPURLResponse.localizedString(forStatusCode: httpResponse.statusCode)
print("httpResponse.allHeaderFields \(message)")
if httpResponse.statusCode > 300{
completion(.failure(error!))
return
}
}
guard let validData = data, error == nil else {
completion(.failure(error!))
return
}
do {
completion(.success(validData))
} catch let serializationError {
completion(.failure(serializationError))
}
}.resume()
}
解决方案
服务器 500 响应不一定等于URLSession
错误,您不能不小心打开可选选项。
创建自定义错误
enum HTTPResponseError : Error {
case serverFailed(String)
}
在闭包中首先处理URLSession
错误,如果状态码不是 200 则响应并返回消息
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error { completion(.failure(error)); return }
if let httpResponse = response as? HTTPURLResponse {
print("PutRoleLedgerTransaction API status: \(httpResponse.statusCode)")
let message: String = HTTPURLResponse.localizedString(forStatusCode: httpResponse.statusCode)
print("httpResponse.allHeaderFields \(message)")
if httpResponse.statusCode != 200 {
completion(.failure(HTTPResponseError.serverFailed(message)))
return
}
}
// The do block makes no sense if no error is being thrown
// do {
// force unwrapping data is safe if error is nil.
completion(.success(data!))
// } catch {
// completion(.failure(error))
// }
...
推荐阅读
- node.js - 如何修复'npm ERR!退出状态 64 ' npm 中的错误
- wordpress - 创建新用户时,Wordpress do_shortcode 不起作用
- web - 如何查看网页上的单个屏幕像素
- tensorflow - 如何直接获取类名作为 yolo tf serving 的输出
- java - 使用 spring 资源访问安全资源
- scala - 模式匹配后无法将参数化类型与具体类型匹配
- python - 安装 keras 后,Conda 提示命令不起作用
- ios - 将捕获的图像存储到 UIImage 数组 (AVFoundation)
- indexing - Intershop 7.10 代码生成器备用密钥生成 - NONUNIQUE
- javascript - 为什么工具提示绝对位置不适用于 js?