Swiftのtry
、throw
、catch
はエラーハンドリングに使われるキーワードで、例外(エラー)を投げたり(throw
)、キャッチしたり(catch
)するために使用します。
1. エラーを定義する (Error プロトコル)
Swiftのエラーは、Error
プロトコルに準拠した enum
で定義するのが一般的です。
enum MyError: Error {
case invalidInput
case networkFailure
}
enumで定義するんですね^^
2. エラーをスローする (throw)
throw
を使ってエラーを発生させることができます。
func validate(input: Int) throws {
if input < 0 {
throw MyError.invalidInput
}
}
エラーを知らせるのも大切ですね
3. エラーを処理する (do-catch)
エラーを処理するには do
ブロック内で try
を使い、catch
でエラーをキャッチします。
do {
try validate(input: -1)
print("Valid input")
} catch MyError.invalidInput {
print("入力が無効です")
} catch {
print("予期しないエラー: \(error)")
}
try catch ではなく doの中でtryでcatcheですね
tryは一つずつなのでしょうか?
4. エラーを無視する (try?)
try?
を使うと、エラーが発生してもnil
を返し、クラッシュせずに処理を進めることができます。
let result = try? validate(input: -1) // エラーが発生すると result は nil になる
print(result) // nil
try? try!は使い所ですね
nil チェックは必要なので
5. エラーを強制的に無視する (try!)
try!
を使うと、エラーが発生しないことを保証する場合に、エラーハンドリングなしで実行できます。ただし、エラーが発生するとクラッシュするので注意が必要です。
try! validate(input: 1) // 問題なし(エラー発生時はクラッシュ)
print("成功!")
こちらはエラー発生でクラッシュ ! 大丈夫なはず?ということはないので。
! を使う場面はあまりないですかね。
6. 関数の戻り値としてエラーをスローする
throws
をつけた関数は、エラーをスローできる関数として定義できます。
func fetchData() throws -> String {
throw MyError.networkFailure
}
do {
let data = try fetchData()
print("データ取得成功: \(data)")
} catch {
print("データ取得失敗: \(error)")
}
throwsのある関数は、tryで呼ぶのかな
ざっとみるとなかなかですね、雰囲気はわかってきました。
エラー例外処理とは?
キーワード | 説明 |
---|---|
throw | エラーを発生させる |
throws | エラーをスローする関数を定義する |
try | エラーを投げる可能性がある処理を実行する |
try? | エラー発生時に nil を返す |
try! | エラーが発生しないことを前提に実行(失敗時クラッシュ) |
do-catch | エラーハンドリングを行う |
基本的には do-catch
を使ってエラーを処理し、影響を受けたくない場合は try?
を使うのが安全な方法です!という感じですね
何気なくこのあたりを入れて作っていきたいです^^/~~
コメント