5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Swiftのエラーハンドリング: try, try?, try!の使い分け

Posted at

はじめに

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からエラーが投げられた場合、datanilになります。エラーが起こらない場合は、正常なデータがdataに入ります。

try!の場合

let data: Data = try! fetchData()

この場合は、fetchDataからエラーが投げられない前提で datafetchDataの返り値を代入しようとします。

万が一エラーが起こった場合、アプリケーションはクラッシュします(突然の死到来)。

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?はエラーの可能性を無視しつつ、結果を安全に扱いたい場合に使える子という印象です(感じ方には個人差がある…カモ🦆)

5
6
0

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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?