【问题标题】:Difference between Xcode Project and Playground about Swift error handlingXcode Project 和 Playground 关于 Swift 错误处理的区别
【发布时间】:2017-07-17 08:01:58
【问题描述】:
  • 为什么我需要为 do-try-catch 提供一般的catch 语句,即使我确定我的自定义错误只在 do-try-catch 语句中抛出?
  • 而且,为什么 Xcode Project 和 Playground 之间的这种行为不同?

我尝试在我的 iOS 应用程序中使用一个简单的 Swift 的 do-try-catch 错误。

enum FooError: Error {
    case foo
}

func fooFunc() throws {
    throw FooError.foo
}

当我调用这个函数时,我试图只捕获FooError.foo 错误。

override func viewDidLoad() {
    super.viewDidLoad()

    do {
        try fooFunc()
    } catch FooError.foo {
        print("foo error is thrown.")
    }
}

但这得到了一个编译错误"Errors thrown from here are not handled because the enclosing catch is not exhaustive"

抛出这个编译错误的原因是我的catch语句不够,我可以通过添加通用catch语句来修复这个错误。

override func viewDidLoad() {
    super.viewDidLoad()

    do {
        try fooFunc()
    } catch FooError.foo {
        print("foo error is thrown.")
    } catch {
        print("something else wrong happened. \(error)")
    }
}

我以为fooFunc 只会抛出FooError,所以catch 语句在没有一般catch 的情况下已经详尽无遗,但似乎我需要添加它。

甚至奇怪的是,当我在 Playground 上运行此代码时,不需要一般的 catch 语句。

do {
    try fooFunc()
} catch FooError.foo {
    print("foo error is thrown.")
}

我想知道为什么 Xcode Project 和 Playground 之间的错误处理行为不同。

【问题讨论】:

    标签: ios swift xcode error-handling swift-playground


    【解决方案1】:

    如果你曾经彻底阅读过 Swift 语言指南,那么发生这种情况的原因并不难找到。

    让我们看看语言指南是怎么说的:

    catch 子句不必处理其 do 子句中的代码可能抛出的所有可能错误。 如果没有任何 catch 子句处理错误,则错误会传播到周围的作用域。 但是,错误必须由某个周围的作用域处理——要么由处理错误的封闭 do-catch 子句,要么通过在一个投掷函数中。

    看到粗体部分了吗?不管发生什么,每种错误都必须处理,也许不在catch 子句中,但必须在某个地方处理。如果不在catch子句中处理,则需要将封闭方法标记为throws或使用try?try!

    您在操场上运行的代码没有任何封闭范围。您正在全局级别编写代码。全局作用域处理错误的方式就是崩溃。尝试在操场上运行此代码。它不编译:

    func a() {
        do {
            try fooFunc()
        } catch FooError.foo {
            print("foo error is thrown.")
        }
    }
    

    基本上,全局作用域会为您处理一切。即使只是这样编译:

    try fooFunc()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多