公開中のアプリ

[Swift入門#33]例外処理を使ってみよう。

今回は「例外処理」について書きたいと思います。
例外処理の説明から実際の使用例までサンプルコードをもとにわかりやすく説明していきたいと思います。

例外処理とは

例外処理ですが、例をあげるとアカウントを作成する処理を作る時などに使います。

アプリとかでアカウント登録する場合などをイメージして欲しいんですけど、その時にアカウント名とかメールアドレスとか必要な情報を入力しますよね?

例えば、一通り情報を入力して登録ボタンを押したとします。
でもカウント名を入力し忘れた時などに「アカウント名を入力して下さい」などのエラーを出したい時に例外処理を使います。

サンプルを確認

え〜っと!ではとりあえず、スタッフを登録する時のクラスを作りました!

class Staff {
    let name: String
    let salaryHour: Int
    
    init(_ name: String, _ salaryHour: Int) {
        self.name = name
        self.salaryHour = salaryHour
    }
}

プロパティは名前を管理する「nameプロパティ」と時給を管理する「salaryHourプロパティ」を用意しました!

今回は時給を登録する時に、最低賃金を下回っている場合と、時給が高過ぎる場合の二つの例外処理を実装したいと思います。

ちなみに東京の最低賃金は1,013円みたいですね!

例外処理を書いてみよう。

では実装していきます。

列挙型で定義

まずは発生する例外の種類を列挙型で定義します。

enum salary: Error {
    case lowSlaryHour
    case highSlaryHour
}

時給が安い場合「lowSlaryHour」
時給が高い場合「highSlaryHour」

例外処理として扱う場合は 「Error」プロトコルを適合 します。

列挙型については[Swift入門#27]列挙型を使ってみようを読んでみてください〜!

メソッドを作成

では次にメソッドを書きます。

func entry() throws {
        guard salaryHour > 1013 else {
            throw salary.lowSlaryHour
        }
        guard salaryHour < 2000 else {
            throw salary.highSlaryHour
        }
        print("時給を登録しました")
    }

ではまず1行目を見てみましょう!
例外が発生する場合、メソッド名の隣にthrows と書けばOKです!

次にguardで異常処理と言う事がわかりやすいように分岐しています。

2行目〜4行目ですが、
lowSlaryHourが1013より大きければ、8行目の処理へ。
lowSlaryHourが1013より小けばelse{}の3行目の処理へ。

3行目の処理ですが、throw というキーワードを使ってsalary.lowSlaryHourを投げています!
もちろん投げっぱなしではなく、この後キャッチする処理も書きます!

5行目〜7行目の説明は2行目〜4行目と同じ流れなので省略します。

実行処理の書き方

では実行処理を書いていきますね。
先ほど、投げた「salary.lowSlaryHour」と「salary.highSlaryHour」をキャッチする処理って事ですね!

let mayugezio = Staff("まゆげじお", 900)

do {
    try mayugezio.entry()
} catch salary.lowSlaryHour {
    print("時給が安過ぎます")
} catch salary.highSlaryHour {
    print("時給が高過ぎます")
}

1行目はインスタンスを生成しただけなので、いったんスルーでお願いします!

まず、3行目のように「do」と書いてあげて、{}の中で「try インスタンス名.メソッド名」こんな感じで書きます。

で次に5行目と7行目のように、先ほど投げたやつをキャッチしてあげて、{}の中にキャッチした時に実行する処理を書けばOKです!

では1行目のインスタンス生成の部分に戻ります。
見てみると時給が900円になっていますよね?
と言う事は今回は、「時給が安過ぎます」が出力されます。

ここの数字を変更すれば結果が変わります。

下記は今回のコードまとめたやつです!

enum salary:Error {
    case lowSlaryHour
    case highSlaryHour
}

class Staff {
    let name: String
    let salaryHour: Int
    init(_ name: String, _ salaryHour: Int) {
        self.name = name
        self.salaryHour = salaryHour
    }

    func entry() throws {
        guard salaryHour > 1013 else {
            throw salary.lowSlaryHour
        }
        guard salaryHour < 2000 else {
            throw salary.highSlaryHour
        }
        print("時給を登録しました")
    }
}

let mayugezio = Staff("まゆげじお", 900)

do {
    try mayugezio.entry()
} catch salary.lowSlaryHour {
    print("時給が安過ぎます")
} catch salary.highSlaryHour {
    print("時給が高過ぎます")
}

まとめ

今回は例外処理について書きました!
まぁいつも言ってますがこう言うのがあるんだなって言うくらいの認識で大丈夫です〜必要になったらこの記事を見てもらえると嬉しいです。

ありがとうございました〜!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アプリ