从这里抛出的Swift 2.0错误未得到处理

Agg*_*sor 13 swift2

使用Xcode 7 Beta 4更新到2.0

我有这个代码块

do
{
    try AVAudioSession.sharedInstance().setActive(true)
} catch let err as NSError
{
    println("Dim background error")
}
Run Code Online (Sandbox Code Playgroud)

它给了我错误(try在线)

从这里抛出的错误不会被处理.

这是编译器错误还是我的语法中缺少某些东西?

我检查了文档,我的代码"看起来"正确.

Mar*_*sel 17

可以AVAudioSession.sharedInstance().setActive(true)抛出哪些类型的错误?
如果它只能抛出NSErrors,那么在捕获错误时不需要指定它.你可以简单地写:

do {
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("Dim background error")
}
Run Code Online (Sandbox Code Playgroud)

如果要在catch-scope中使用错误,仍可以访问它.Swift会自动将抛出的错误绑定到error,可以使用:

catch {
    // do something with `error`
}
Run Code Online (Sandbox Code Playgroud)

如果该方法抛出多种类型的错误,并且您只想处理NSErrors 的那些错误,则可以有条件地绑定它们:

catch let specialError as NSError {
    // do something with `specialError`
}
Run Code Online (Sandbox Code Playgroud)

但是,您必须确保处理每个抛出的错误.所以假设该方法也可以抛出RandomError(我现在刚刚编写),你必须写:

catch let randomError as RandomError {
    // do something with `randomError`
}
Run Code Online (Sandbox Code Playgroud)

......除catchNSError.
或者你当然可以使用一般情况:

catch {
    // do something with `error`
}
Run Code Online (Sandbox Code Playgroud)

因此,我认为您的问题可以通过let err as NSError从您的catch-statement中删除来解决.

  • 是的,我觉得编译器坏了.自动完成失败(以及语法突出显示),我已经尝试了泛型,并且具体它会抛出(没有工作).我应该在帖子中提到过.对遗漏道歉. (2认同)

Mar*_*one 2

可能是编译器错误。无论如何尝试删除let err as NSErrorcatch如果你想捕获所有错误,单独就足够了。

另外,对于 Swift 2,您应该使用print,而不是println

以下代码在 XCode 7 Beta 4 上编译不会出现错误:

import AVFoundation

class X {
    func y() {
        do {
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            print("Dim background error \(error)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)