見出し画像

【Swift】throw・do・try・catchとは?

今回は僕がたまに目にはするけど、どういう意味か全くわからず使っていた
throw・do・try・catch
についてまとめました。

■何をするためにあるの?

 ・throw、
throwsとは
 ・catchとは
 ・doとは
 ・tryとは
■まとめ

この順番で解説していきます!

■何をするためにあるの?

一言で言うとこの4つはプログラムに予期せぬ異常事態(エラー)が出たときの対処のためにあります。

異常事態とは例えば、「数値が返ってくるように組んだプログラムで、実行したときに文字列が返ってきてしまった」、みたいな時です。
この時エラー対策を何もしていないと、プラグラムはなす術なくクラッシュします。

このような
「もしかしたらエラーになるかもしれない・・・」
という処理がある時

そのままにしておくと
いつエラーが起きてクラッシュするかドキドキじゃないですか?

そういうときにこのthrow,do,try,catchを使えば、あらかじめ
「エラーになった時はこういう処理をしてね」
と準備をしておいてクラッシュを回避することができます。

では、一つ一つ役割を見ていきましょう。

・throw、throwsの役割

まずthrowとは、文字通り「投げる」という意味です。
swiftでは、何か異常事態(エラー)が発生したときにそれを知らせることを「エラーを投げる」と言います。
つまりthrowの役割は

「エラーがありました!これが内容です!」

というようにエラーを報告することになります。

次に、throwsです。
これは関数の後ろに記述して
「この関数はエラーが出るかもしれませんよ〜、throwさん投げる準備しといてくださいね〜」
という感じでエラーが出るかもよ!と教えてくれるものです。throwとthrowsは以下のように記述します。

func method(str: String) throws {
    if str.isEmpty {
       throw NSError(domain: "errorメッセージ", code: -1, userInfo: nil)
   }
   print(str)
}

・catchの役割

catch(キャッチ)はこれも文字通り「捕まえる」という意味です。
catchの役割は

「throwで投げられたエラーを捕まえること」

です。
「エラー報告ありがとうございます!あとはこちらで対処します!」
というイメージですね。このキャッチでエラーの処理を行います。


書き方は次のdoと一緒に記述します!


・doの役割

doは範囲を決めるために使われます。
若干本来の意味とずれるのですが、簡単にいうとdoの役割は

「この範囲の中でエラーがでるかもしれない処理をしますよ〜、catchさん待機しといてくださいね〜」

という範囲を決めることです。先ほどのcatchはこの後ろでエラーが投げられるのを待機しています。
プログラミングにはスコープ(範囲)というのがあり、doにはこの機能があります。簡単にいうと、見える範囲を決めるということなのですが気になる方は調べてみてください。

doとcatchは以下のように記述します。

do {
    
    -------エラーが出る範囲-------

} catch {

    -------出てきたエラーの処理-------

}


・tryの役割

tryはエラーを投げてくるかもしれない処理を実行するときにその関数の前につけます。
「エラーを投げてくるかもしれない処理」とは、先ほどのthrowsのついた関数ですね。
doで範囲を決めてcatchを待機させて準備万端のところで最後に

「処理を開始します!皆さんよろしくお願いします!」

と最後の開始宣言をしてくれるものです。throwsのついた処理を実行するときには必ずこいつを前につける必要があります。

do {
    -------エラーが出る範囲-------
    try method(num: Int)
    --------------------------

} catch {

    -------出てきたエラーの処理-------

}

このようにdoのなかで記述します。


■まとめ

上記のをまとめて記述すると


//エラーかもしれない関数(throwsつき)を作る
func method(str: String) throws {
    if str.isEmpty {
       throw NSError(domain: "errorメッセージ", code: -1, userInfo: nil)
   }
   print(str)
}


//関数を実行する
func test() {
    do {

        try method(str: test)     //doで範囲を決めてtryで実行

    } catch {
        
        //--------エラー処理-------//

    }
}

こんな感じになります。

結構自分では詰まった部分なので、誰かの参考になれば幸いです。
また、もし間違っている部分や指摘があれば教えてくださると嬉しいです!

いいなと思ったら応援しよう!