2015-09-04 18 views
91

Swift 2.0に、Appleはエラー(do-try-catch)を処理する新しい方法を導入しました。 数日前のBeta 6ではさらに新しいキーワード(try?)が導入されました。 また、try!を使用できることも知っていました。 3つのキーワードの違いは何ですか?それぞれのキーワードはいつ使用されますか?試してみてください!試してみる?違いは何ですか?そして、それぞれをいつ使用するのですか?

答えて

187

は、以下の投げの関数を想定します。

enum ThrowableError : ErrorType { case BadError } 

func doSomething() throws -> String { 
    if everythingIsFine { 
     return "Everything is ok" 
    } else { 
     throw ThrowableError.BadError 
    } 
} 

あなたがスローされることがあり関数を呼び出してしようとするが、2つのオプションを持っている

を試してみてください。

あなたがdo-catchブロック内の通話囲んでエラー処理の責任を取ることができます。

do { 
    let result = try doSomething() 
} 
catch { 
    // Here you know about the error 
    // Feel free to handle to re-throw 
} 

それとも、関数を呼び出してみてくださいを、そしての次の呼び出し側にに沿って、エラーを渡しますコールチェーン:

func doSomeOtherThing() throws -> Void {  
    // Not within a do-catch block. 
    // Any errors will be re-thrown to callers. 
    let result = try doSomething() 
}

try!

暗黙のうちにアンラップされたオプションに、その中にnilを付けてアクセスしようとするとどうなりますか?はい、本当に、アプリはクラッシュします! 試しにも同じです!それは基本的にエラーチェーンを無視し、 "doかdie"の状況を宣言します。呼び出された関数がエラーをスローしなかった場合は、すべて正常に機能します。しかし、それが失敗してエラーを投げた場合、アプリケーションは単にをクラッシュさせます。

let result = try! doSomething() // if an error was thrown, CRASH! 

try?

Xcode 7ベータ6で導入された新しいキーワードです。は、成功した値をアンラップし、nilを返してエラーをキャッチするオプションのを返します。

if let result = try? doSomething() { 
    // doSomething succeeded, and result is unwrapped. 
} else { 
    // Ouch, doSomething() threw an error. 
} 

それとも新たな素晴らしいガードキーワードを使用することができます:あなたはそれがnilに翻訳されていますように、起こったエラーを破棄しているtry?ノートを使用することによって、ここに

guard let result = try? doSomething() else { 
    // Ouch, doSomething() threw an error. 
} 
// doSomething succeeded, and result is unwrapped. 

最後の注意を。 tryを使用しますか?あなたが成功と失敗にもっと集中しているとき、なぜ失敗したのかではありません。

+0

2番目のコードサンプル( 'let result = try doSomething()// do-catchブロック内にはない')は、 'throws'として宣言されたメソッドの中から呼び出されます。したがって、 'doSomething()'が失敗すると、外側のメソッドも同様に(順番に)行われますか? –

+0

はい、確かです。私はそれに応じて編集します。 – Abdurrahman

+1

ガード・ゴスペル説教のためにアップホードされました –

関連する問題