2017-02-26 22 views
1
  • do-try-catchステートメントでカスタムエラーがスローされただけで、do-try-catchの一般的な文を指定する必要があるのはなぜですか? ?
  • Xcode ProjectとPlaygroundでこの動作が異なるのはなぜですか?

iOSアプリケーションで簡単なSwiftのdo-try-catchエラーを使用しようとしました。Xcodeプロジェクトとプレイグラウンドの違いによるスウィフトエラー処理の違い

enum FooError: Error { 
    case foo 
} 

func fooFunc() throws { 
    throw FooError.foo 
} 

この関数を呼び出すと、エラー番号FooError.fooしか捕捉しようとしませんでした。

これはコンパイルエラー"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ステートメントは、一般的なキャッチせずに、既に網羅あるが、私がそれを追加する必要がありそうです。

Playgroundでこのコードを実行すると、奇妙なことも一般的にcatchのステートメントは必要ありません。

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

Xcode ProjectとPlaygroundの間でエラー処理の動作が異なるのはなぜかと思いました。

答えて

1

スウィフト言語ガイドを徹底的に読んだことがある場合は、これが起こる理由を見つけるのは難しくありません。

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() 
関連する問題