LoginSignup
13
18

More than 3 years have passed since last update.

【Swift】エラー処理 throws / throw / try / do / catch について学んだ

Last updated at Posted at 2020-09-05

はじめに

Swift を学び始めて1ヶ月足らずの初心者です。
throws / throw / try / do / catch などについて学習しました。理解した内容を投稿します。

エラー処理 throw, try, do, catchについて概要

まずエラー処理とは

プログラムを実行し、予期しないエラーが発生した場合に対応する処理のこと。

throws, throw, try, do, catchの処理の流れ(全体像)

  1. throwsを付けてエラーを投げる可能性のあるメソッドを定義
  2. 定義した関数の中でエラーを投げる処理をthrowを付けて記述
  3. doのスコープ内でtryを付けてエラー発生可能性のあるメソッドを呼び出し
  4. tryの処理でエラーが発生したときに実行されるcatchを定義

コードで流れ、全体像を確認

sample.swift

// エラーを投げる可能性のある関数を定義
func メソッド名(引数名: ) throws -> 戻り値 {
    // エラーを投げる可能性のある処理を記述
    throw エラーを投げる処理内容
}

// エラーを対処する
do {
    // エラーの発生する可能性のある処理を記述
    try エラー発生可能性のあるメソッドを呼び出し
} catch {
    // do内 try の処理でエラーが発生した場合の処理
}

実際にコードで動作を確認

エラー発生しないパターン

sample.swift

import Foundation

// 引数nameがあるときにnameの値を出力する関数
func printName(name: String) throws {

    // 引数nameが空文字の場合にエラーとなる処理を記述
    if name.isEmpty { // nameが空文字のときにtrueとなる
        throw NSError(domain: "error", code: -1, userInfo: nil) // NSErrorでエラーを発生させる
    }
    print(name)
}

do {
    // エラーの発生する可能性のある処理を記述
    try printName(name: "松田")
    print("処理成功") // ここまで実行される
} catch {
    // do内 try の処理でエラーが発生した場合の記述
    print("エラー発生")
}

// 出力結果 => 松田
//      => 処理成功

処理失敗エラー発生パターン

do 処理内の "松田" => ""(空文字) に変更しただけ

sample.swift
import Foundation

func printName(name: String) throws {
    // nameが空文字の場合にはエラーとなる
    if name.isEmpty {
        throw NSError(domain: "error", code: -1, userInfo: nil) // NSErrorでエラーを発生させる
    }
    print(name)
}

do {
    // エラーの発生する可能性のある処理を記述
    try printName(name: "") // ここでdo内処理がストップして、catchに移る
    print("処理成功") // ここの処理まで到達しない
} catch {
    // do内 try の処理でエラーが発生した場合の記述
    print("エラー発生")
}

// 出力結果 => エラー発生

do スコープ内内ではのtry printName(name: "")で処理がストップし、catchに処理が移る。
下記のようにcatchスコープ内で定数errorを使ってエラーの内容にアクセスすることもできる。

sample.swift
// 省略

} catch {
    // do内 try の処理でエラーが発生した場合の記述
    print(error)
    print("エラー発生")
}

// 出力結果 => Error Domain=error Code=-1 "(null)"
//        => エラー発生

try?, try! について

try?を使うとエラーが起きても無視されて何も行われない

sample.swift
import Foundation

func printName(name: String) throws {
    // nameが空文字の場合にはエラーとなる
    if name.isEmpty {
        throw NSError(domain: "error", code: -1, userInfo: nil) // NSErrorでエラーを発生させる
    }
    print(name)
}

try? printName(name: "") // エラーは無視される

// 出力結果 =>

try!を使うとエラーが発生した場合に実行時エラーとなり、アプリがクラッシュ(停止)する

sample.swift
import Foundation

func printName(name: String) throws {
    // nameが空文字の場合にはエラーとなる
    if name.isEmpty {
        throw NSError(domain: "error", code: -1, userInfo: nil) // NSErrorでエラーを発生させる
    }
    print(name)
}

try! printName(name: "") // クラッシュ

// 出力結果 => Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=error Code=-1 "(null)": file youtubePlayground.playground, line XX

参考文献

大変わかりやすく参考にさせていただきました。
本当にありがとうございます。

最後に

見習いエンジニアのSwift初心者です。
間違いご指摘などございましたら、どうぞコメントなどよろしくお願いします。

13
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
18