web-dev-qa-db-ja.com

Swift 2.0ここからスローされたエラーは処理されません

Xcode 7 Beta4で2.0にアップデート

私はこのコードブロックを持っています

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

そして、それは私にエラーを与えます(try行で)

ここからスローされたエラーは処理されません。

これはコンパイラエラーですか、それとも構文に欠けているものがありますか?

ドキュメントを確認したところ、コードは「正しく見えます」。

13
Aggressor

AVAudioSession.sharedInstance().setActive(true)はどのような種類のエラーをスローできますか?
NSErrorsしかスローできない場合は、エラーをキャッチするときにこれを指定する必要はありません。あなたは単に書くことができます:

do {
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("Dim background error")
}

catch-スコープでエラーを使用する場合でも、アクセスできます。 Swiftはスローされたエラーを自動的にerrorにバインドします。これは、次のように使用できます。

catch {
    // do something with `error`
}

メソッドが複数のタイプのエラーをスローし、NSErrorsであるものだけを処理したい場合は、条件付きでそれらをバインドできます。

catch let specialError as NSError {
    // do something with `specialError`
}

ただし、スローされたすべてのエラーが処理されることを確認する必要があります。したがって、メソッドがRandomError(今作成したばかり)もスローできると仮定すると、次のように記述する必要があります。

catch let randomError as RandomError {
    // do something with `randomError`
}

... catchNSErrorに加えて。
または、もちろん一般的なケースを使用することもできます。

catch {
    // do something with `error`
}

したがって、catchステートメントからlet err as NSErrorを削除することで、問題を解決できると思います。

17
Marcus Rossel

コンパイラのバグである可能性があります。とにかくlet err as NSErrorを削除してみてください;すべてのエラーをキャッチしたい場合は、catchだけで十分です。

また、Swift 2では、printではなくprintlnを使用する必要があります。

次のコードは、XCode 7 Beta4でエラーなしでコンパイルされます。

import AVFoundation

class X {
    func y() {
        do {
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            print("Dim background error \(error)")
        }
    }
}
2
Mario Zannone