はじめに
Swift を学び始めて1ヶ月足らずの初心者です。
throws / throw / try / do / catch などについて学習しました。理解した内容を投稿します。
エラー処理 throw, try, do, catchについて概要
まずエラー処理とは
プログラムを実行し、予期しないエラーが発生した場合に対応する処理のこと。
throws, throw, try, do, catchの処理の流れ(全体像)
-
throws
を付けてエラーを投げる可能性のあるメソッドを定義 - 定義した関数の中でエラーを投げる処理を
throw
を付けて記述 -
do
のスコープ内でtry
を付けてエラー発生可能性のあるメソッドを呼び出し -
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入門】do-catchとtryでエラー処理を記述する方法
- Swift 4.0 エラー処理入門
- Swift 実践入門(書籍)
最後に
見習いエンジニアのSwift初心者です。
間違いご指摘などございましたら、どうぞコメントなどよろしくお願いします。