2017-07-14 5 views
1

Swiftのキャッチ句は網羅的でなければなりません。エラー伝搬を避けたいときはいつでもワイルドカードや空のcatch節を使う必要があるのでしょうか?例:私は関数にthrowsを追加する場合はもちろんSwiftで空またはワイルドカードのない完全なcatchブロック3.1

enum Oops: Error { 
    case oh, ouch, meh 
} 

func troublemaker() { 
    do { throw Oops.meh } 
    catch Oops.oh {} 
    catch Oops.ouch {} 
    catch Oops.meh {} 
    // Error: Error is not handled because the enclosing catch is not exhaustive 
} 

、それが固定されています。 catch {}またはcatch _ {}のいずれかを追加する場合も同じです。

しかし、徹底的なキャッチブロックを他の方法で作る方法はありますか?私の列挙型エラーが網羅的になるように、おそらく、許可するエラーの種類をスローするように定義しますか?

+1

あなたがスローされるエラーを指定することはできません。 https://stackoverflow.com/questions/39618095/can-i-restrict-the-type-that-a-function-throws-in-swiftまたはhttps://stackoverflow.com/questions/30740997/what-isを比較してください2-0-do-try-catch-and-regular-java-cc-exの2つの違いがあります。 –

+1

https://stackoverflow.com/q/40718542/2976878も参照してください。 – Hamish

答えて

0

あなたは、単に複数のcatchブロックが気に入らない場合は、一度、その後のすべてのエラーをキャッチし、エラーの種類を切り替える

func troublemaker() { 
    do { throw Oops.meh } 
    catch let error{ 
     switch error { 
     case Oops.meh: 
      print("It works!") 
      break 
     default: 
      print("Oops something else is wrong") 
      break 
     } 
    } 
} 
関連する問題