2017-05-12 5 views
2

throwsという関数で作業する場合、考えられるエラーを処理するためにdo-catchを使用します。関数を記述していて、その関数にエラーを伝播させたいとしましょう:Swift 3 - do-catchとthrow

public func myFunc() throws 
{ 
    do 
    { 
     let obj = try convert(param: 42) 
     // work with obj... 
    } 
    catch 
    { 
     print("failed: \(String(describing: error))") 
     throw MyError.ConversionFailed 
    } 
} 

それは素晴らしいです。

public func myFunc() throws 
{ 
    do 
    { 
     let obj = try convert(param: 42) 
     // work with obj... 
     if obj is Array 
     { 
      // great, continue working with obj... 
     } 
     else 
     { 
      throw MyError.NotAnArray 
     } 
    } 
    catch 
    { 
     print("failed: \(String(describing: error))") 
     throw MyError.ConversionFailed 
    } 
} 

しかし、これは動作しません:インナーthrowdo-catchにキャッチされ、myFuncがちょうどますが、我々は関数がエラーの異なる種類をスローすることがありますmyFuncでカスタム・ロジックを持っている今、言わせてNotAnArrayエラーの代わりにエラーConversionFailedをスローします。

仕事にこれを作るための一つの方法は次のとおりです。

public func myFunc() throws 
{ 
    do 
    { 
     let obj = try convert(param: 42) 
     // work with obj... 
     if obj is Array 
     { 
      // great, continue working with obj... 
     } 
     else 
     { 
      throw MyError.NotAnArray(object: obj) 
     } 
    } 
    catch MyError.NotAnArray(let obj) 
    { 
     throw MyError.NotAnArray(object: obj) 
    } 
    catch 
    { 
     print("failed: \(String(describing: error))") 
     throw MyError.ConversionFailed 
    } 
} 

動作すること、それは、関連する値がある場合は特に、繰り返しのようで、カスタム・ロジックが複雑な場合、私はいくつかのcatch ESが必要になる場合があります。これを行うより良い方法はありますか?

答えて

1

convert() のエラーを別のエラーで置き換えたい場合は、ローカルのdo/catchコンテキストでconvert()を呼び出します。 投げ機能が のエラーを「自動的に」(How to pass an Error up the stack trace in Swiftと比較して)伝播するので、外側のdo/catchは必要ありません。

public func myFunc() throws 
{ 
    let obj: Any // or whatever type convert() returns 
    do { 
     obj = try convert(param: 42) 
    } catch { 
     throw MyError.ConversionFailed 
    } 
    // work with obj... 
    if obj is Array { 
     // great, continue working with obj... 
    } else { 
     throw MyError.NotAnArray 
    } 
} 
+0

ありがとうございました。自動増殖も良い点です、私はそれを知らなかった。しかし、もし私が同じことをやり直すのではなく、カスタムエラーを投げるという私の意欲を変えたら? – Stephenye

+0

@Stephenye: 'aFunctionThatThrows()'によってスローされたエラーをカスタムエラーで置き換えることを意味しますか?その場合は、ローカルdo/catchコンテキストで関数を呼び出さなければなりません。 –

+0

はい、質問を更新して、私が意味することをよりよく説明しました。その場合、別のキャッチが必要だと思いますか? – Stephenye