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
}
}
しかし、これは動作しません:インナーthrow
はdo-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が必要になる場合があります。これを行うより良い方法はありますか?
ありがとうございました。自動増殖も良い点です、私はそれを知らなかった。しかし、もし私が同じことをやり直すのではなく、カスタムエラーを投げるという私の意欲を変えたら? – Stephenye
@Stephenye: 'aFunctionThatThrows()'によってスローされたエラーをカスタムエラーで置き換えることを意味しますか?その場合は、ローカルdo/catchコンテキストで関数を呼び出さなければなりません。 –
はい、質問を更新して、私が意味することをよりよく説明しました。その場合、別のキャッチが必要だと思いますか? – Stephenye