关闭后线路未运行

问题描述 投票:0回答:1

我的代码的某些行没有运行

   func createaddress() async {
        do {
            let defaults = UserDefaults.standard
            guard let userid = defaults.string(forKey: "userid") else { return }
           let response = try await Amplify.API.mutate(request:
                .createUserAddress(bycreateUserAddressPayload: address, addressName: addressName, isDefault: isDefault, landmark: landmark, userId:  "USR- \(userid)", city: city, state: state)
           )
            switch response {
            case .success(let Result):
//                    print(graphQLResult)
                if let JSONdata = Result.value(at: "createUserAddress"),
                    let todoData = try? JSONEncoder().encode(JSONdata),
                   let response = try? JSONDecoder().decode(UserAddressResponse.self, from: todoData) {
                    print(response.userAddress.id)
                    DispatchQueue.main.async {
                        self.Loading = false
                    }
                }
               
                
            case.failure(let error):
                DispatchQueue.main.async {
                    self.Loading = false
                    self.showerrormessage = true
                    self.errormessage = "Failed to Create Address"
                    
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                    self.showerrormessage = false
                    self.errormessage = ""
                }
                print("Failed to get  UserAddressData: \(error)")
            }
        } catch let error as APIError {
            print("Failed to query CreateUserAddress: \(error)")
        } catch {
            print("Unexpected error CreateUserAddress: \(error)")
        }
    }

第 440 到 442 行“let response = try? JSONDecoder().decode(UserAddressResponse.self, from: todoData)”之后的闭包中的代码没有运行

swift async-await aws-amplify aws-appsync
1个回答
0
投票

在诊断问题之前,您首先需要确保报告错误是什么。这里的挑战是,您有两种情况,如果出现问题,您会在没有诊断信息的情况下默默地失败:

    如果失败,
  1. try?
    将返回
    nil
    ,但会丢弃有意义的诊断信息。使用
    try
    (不使用
    if let
    guard let
    ,因为它不再是可选的)并让您的
    catch
    子句报告出了什么问题。

  2. 如果

    result.value(at: …)
    失败并返回
    nil
    ,则
    if
    语句将不被满足,并且不会报告任何有意义的内容。

因此,您可能想做类似的事情:

switch response {
case .success(let result):
    guard let jsonData = result.value(at: "createUserAddress") else {
        print("createUserAddress not found")                            // better, I would create new error regarding “value(at:) failed”, and throw that error, but I am trying to keep it as simple as possible
        return
    }
    let todoData = try JSONEncoder().encode(jsonData)
    let response = try JSONDecoder().decode(UserAddressResponse.self, from: todoData) 
    print(response.userAddress.id)
    …
    
case.failure(let error):
    …
}

因为我们使用

try
而不是
try?
,所以我们从
if let
子句中删除了它们,但
catch
子句会在控制台上报告错误。同样,如果
value(at:)
由于某种原因失败,我们会打印一条消息,现在您将收到有关该问题的通知。

(顺便说一句,

JSONDecoder
方法
decoder
不接受尾随闭包,所以我删除了它。同样,我遵守以小写字母开头的 Swift 变量命名约定。但这两个都不是非常相关手头的问题,所以不要因此分心。但我想解释上面的代码片段中包含的一些不相关的更改。)

无论如何,现在 (a) 如果

value(at:)
失败,您将打印一条消息; (b) 如果编码/解码失败,允许
try
抛出任何错误,您现在应该能够诊断为什么执行没有继续进行。因此,再次运行代码,看看会产生什么错误。

如果您不清楚新的运行时错误的含义,请就此发布一个单独的问题(但请随意在评论中添加指向新的单独问题的链接)。但希望上面的内容能够回答为什么您当前没有获得有关运行时出错的任何诊断信息的问题。


现在,我可能会建议进行大量额外的改进,但它们与眼前的问题无关(您的执行路径将在没有任何诊断信息的情况下默默地失败)。但如果您对其他观察结果感兴趣,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.