【问题标题】:Swift: how to detect the error type using the debugger?Swift:如何使用调试器检测错误类型?
【发布时间】:2021-01-27 03:06:38
【问题描述】:

我是 iOS 开发的新手,所以我的想法可能有误。我用调用 API 的函数编写了一个视图模型,一切正常。

class SearchCityViewModel : ViewModelProtocol {
//OBSERVABLES
var cities = PublishSubject<[City]>()
var networkError = PublishSubject<Void>()
var generalError = PublishSubject<Void>()

init(){
    print("Init SearchCityViewModel")
    reinit()
}

func reinit(){}

func searchCity(stringToSearch: String){
    async {
        do {
            if stringToSearch.count>=2 {
                let cities = try await(api.getCities(cityToSearch: stringToSearch)).payload!
                self.cities.onNext(cities)
            }
            else {
                self.cities.onNext([])
            }
        }
        catch {
            self.generalError.onNext(Void())
        }
    }
}

现在我想处理错误。在 catch 块中,我想区分我想要优雅处理的所有错误,而对于其他错误,我只想发出一般错误。为此,首先我需要知道当我想要处理的情况发生时会引发哪个错误。我通常用调试器来做这件事。例如,我禁用了互联网连接,并在 catch 块内创建了一个断点。这个想法是检查禁用 Internet 连接时引发的错误,以便为这种错误创建一个 catch 块。

Image of the debugger

我很挣扎,因为使用调试器我只看到这是一个 AFError 实例,但它并没有告诉我更多可以帮助我捕捉它的信息。

我的工作流程有什么问题?我真的需要每次都阅读所有文档吗?对于我使用的每个库?

谢谢!

【问题讨论】:

    标签: ios swift xcode debugging error-handling


    【解决方案1】:

    也许你可以阅读文章然后你就会知道如何做得更好,你可以使用框架 -oslog 而不是使用打印功能。 debugging your logging info

    【讨论】:

    • 很有趣,但我认为这与我的问题无关。还是谢谢你
    【解决方案2】:

    我找到了路。我缺少的是将错误转换为 NSError。这样,用调试器就有可能看到错误所在的域和代码。在 Alamofire 的情况下,真正的错误被包装了,并且可以通过基础错误属性访问。获得域和错误代码后,我编写了以下代码:

    class SearchCityViewModel : ViewModelProtocol {
        //OBSERVABLES
        var cities = PublishSubject<[City]>()
        var networkError = PublishSubject<Void>()
        var generalError = PublishSubject<Void>()
    
        init(){
            print("Init SearchCityViewModel")
            reinit()
        }
    
        func reinit(){}
    
        func searchCity(stringToSearch: String){
            async {
                do {
                    if stringToSearch.count>=2 {
                        let cities = try await(api.getCities(cityToSearch: stringToSearch)).payload!
                        self.cities.onNext(cities)
                    }
                    else {
                        self.cities.onNext([])
                    }
                }
                catch {
                    if let afError = asAFError, let underlyingError = afError.underlyingError as NSError?, underlyingError.domain == NSURLErrorDomain, underlyingError.code == NSURLErrorNotConnectedToInternet || underlyingError.code == NSURLErrorTimedOut {
                        self.networkError.onNext(Void())
                    }
                    else {
                        self.generalError.onNext(Void())
                    }
                }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2014-11-14
      • 2013-10-21
      • 1970-01-01
      • 2015-10-05
      • 2016-04-06
      相关资源
      最近更新 更多