【问题标题】:How to identify which errors are thrown by a method如何识别方法抛出了哪些错误
【发布时间】:2018-03-11 12:51:25
【问题描述】:

简单的问题,之前的主题中尚未回答 - 请在将其标记为重复之前仔细阅读这些主题的答案,问题可能重复但答案尚不令人满意 - 如何识别方法抛出错误以便在 catch 子句中指定?

例如,请看下面的代码。它可以工作,但我更喜欢在同一个嵌套级别有一个单一的 do - 和多个 catch,而不是嵌套的 do(s)。

为了实现这一点,我需要知道抛出了哪个 ErrorType String.init(contentsOf:encoding:) 和 String.write(to:atomically:encoding:) ,显然无法从文档中弄清楚这一点,也不是来自源代码。

我错过了什么吗?

    do {
            var contents =  try String(contentsOf: indexFileUrl, encoding: .utf8)
            let jsonText = String(describing: SmartGamesManager.shared.jsonText)
            contents = contents.replacingOccurrences(of: text, with: jsonText)
            // write to file
            do {
                try contents.write(to: indexFileUrl, atomically: false, encoding: .utf8)
            }
            catch  {
                print("could not write file index.html")
            }
        }
        catch {
            print("could not retrieve content of index.html")
        }

【问题讨论】:

  • 您只能捕获某些错误类型,如果多个方法可以抛出相同的错误,您无法确定您的几个可抛出函数中的哪一个抛出了错误。一种可行的解决方案是重新抛出自定义错误,但即便如此,您也需要嵌套的 do-catch 块。
  • 使用可选的try怎么样?即:if let blah = try? Something() {}pastebin.com/KRi6eA2k
  • 不幸的是,如果不拔掉头发,您将无能为力。 Dávid 提供的解决方案是我个人使用的解决方案;我创建了我自己的enum 类型,它符合ErrorCustomStringConvertible,它“转发”底层Errors。
  • 谢谢你们,但我发现这无法像在 Java 异常中那样处理……不在这里寻找解决方法。
  • 你可以做var contents: String; do { contents = try String(contentsOf: indexFileUrl, encoding: .utf8) } catch { print("could not retrieve content of index.html"); return } let jsonText = ...。尽管如此,我还是不太明白您通过分离 catch 块来实现什么。

标签: ios swift error-handling


【解决方案1】:

'catch' 块中有一个名为 'error' 的常量,其中包含方法引发的错误。您可以调用其属性“localizedDescription”来获取有关错误的信息,或者您也可以将其转换为 NSError 并使用其各种属性来获取方法抛出的任何信息

例如:

      do {
                var contents =  try String(contentsOf: indexFileUrl,
encoding: .utf8)
                let jsonText = String(describing: SmartGamesManager.shared.jsonText)
                contents = contents.replacingOccurrences(of: text, with: jsonText)

                do {
                    try contents.write(to: indexFileUrl, atomically: false, encoding: .utf8)
                }
                catch  {
                    print(error.localizedDescription)
                }
            }
            catch let nserr as NSError {
                print(nserr.description) // one of many attributes
            }

【讨论】:

  • 谢谢@Juliannvro,但这根本不是我在这里寻找的,我想知道在编译时该方法会抛出哪种错误以便处理它们,而不是在运行时阅读它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多