はじめに
Swiftでは、エラー処理を行う際にtry
, try?
, try!
という3つのキーワードが出てきます。
Swiftの勉強ハジメマシタな私には、これらの挙動の違いがややこしく感じました。
これらの違いを具体的なコード例を交えてまとめることで、自身の理解を深めつつ、
この記事を読んでくださった人の一助になれば幸いです🙇♂️
結論
-
try
はエラーが投げられる可能性のあるコードで使用し、do-catch
ブロックでエラーをキャッチする -
try?
はエラーが投げられた場合にnilを返し、そうでなければ結果をオプショナルで返す -
try!
はエラーが投げられることを無視し、エラーが発生した場合はランタイムエラーでクラッシュします
try?
とtry!
の違いについて
try?
とtry!
は、エラーハンドリングを簡略化するために使える記述。
似てるようでこの二つは安全性に大きな違いがあります。
(しっかりクラッシュさせました😭)
try?
の場合
func fetchData() throws -> Data {
// ネットワークからデータを取得するコード
return Data()
}
let data: Data? = try? fetchData()
この例では、fetchData
からエラーが投げられた場合、data
はnil
になります。エラーが起こらない場合は、正常なデータがdata
に入ります。
try!
の場合
let data: Data = try! fetchData()
この場合は、fetchData
からエラーが投げられない前提で data
に fetchData
の返り値を代入しようとします。
万が一エラーが起こった場合、アプリケーションはクラッシュします(突然の死到来)。
try?
とtry!
をdo-catch文に書き下すと
try?
の場合
let data: Data?
do {
data = try fetchData()
} catch {
data = nil
}
try!
の場合
let data: Data
do {
data = try fetchData()
} catch {
fatalError("エラーが発生しました")
}
こんなイメージで、try!
はエラー発生時にプログラムを強制終了させます。
最後に
try
, try?
, try!
を上手に使い分けるとエラーハンドリングをより柔軟に制御できそう。
特に、try?
はエラーの可能性を無視しつつ、結果を安全に扱いたい場合に使える子という印象です(感じ方には個人差がある…カモ🦆)