2016-05-22 4 views
1

私はSwiftのtry &キャッチコンストラクトに慣れようとしています。 申し訳ありませんが、関連する記事で回答が見つかりませんでした。ファンクションまたはクラス内での迅速なtry-catch処理

ここに示すように、これを関数またはクラスに非表示にすることはできますか?

class Test { 

enum TestError:ErrorType{ 
    case a 
    case b 
} 

func a(s:String) throws -> String{ 
    if s == "OK" { 
     return "OK" 
    }else{ 
     throw TestError.a 
    } 
} 

func b(s:String) throws -> String{ 
    if s == "OK" { 
     return "OK" 
    }else{ 
     throw TestError.b 
    } 
} 

func doTest(str:String) -> String{ 
    do{ 
     let s = try a(b(str)) // <= ERROR 
    }catch TestError.a{ 
     return "a failed!" 
    }catch TestError.b{ 
     return "b failed!" 
    } 
} 

} 私はいつも

error: errors thrown from here are not handled because the enclosing catch is not exhaustive

を得ることは不可能とメインプログラムでのみ適用原則的にですか? または方法がありますか?

答えて

3

異なるエラーがスローされる場合は、コンパイラに句が必要です。私はNSErrorにキャストすることによって、このようなグローバルなキャッチをしたい:

do { 
    return try a(b(str)) 
} catch TestError.a { 
    return "a failed!" 
} catch TestError.b { 
    return "b failed!" 
} catch let error as NSError { 
    return "\(error.description)" 
} 

あなたはまた、tryで文字列を返すことがあります。

+0

素晴らしい!どうもありがとう!これは問題を解決するようだ(もちろん、私はリターンを忘れてしまった!)。しかし、正直なところ、私はObj-CとSwiftスターターに慣れていないので、何が起こっているのか分かりません。このerror.descriptionはどこに定義されていますか? – pawi

+0

エラーのスローから戻ってくる追加情報(例外の特定の原因)は何とかできますか? – pawi