【Swift入門】do-catchとtryでエラー処理を記述する方法

こんにちは!フリーエンジニアのせきです。

プログラムを実行すると様々なエラーが発生し、それに対する処理を行う必要があります。

この記事では、

・エラー処理とは何か知りたい
・エラーを発生させる方法を知りたい
・エラーを処理する方法を知りたい

という基本的な内容から、

・「try?」「try!」の用途を知りたい
・エラーが発生しても行う処理を記述する方法を知りたい

といった応用的な内容に関しても解説していきます。

今回はそんなエラー処理を記述する方法について、わかりやすく解説します!

エラー処理とは

プログラムを実行すると、予期しないエラーが発生する場合があります。

そのエラーに対して適切な処理をしていないと、プログラムはそこで異常終了してしまいます。

今回はエラーに対する処理の書き方を解説していきます。

ErrorとNSError

Swiftでは実行時に発生するエラーを、Errorプロトコルで扱います。

プロトコルとはJavaやC#でいうインタフェースで、クラスや構造体が実装するプロパティとメソッドを定義してあるものです。

自分でErrorプロトコルを適用した列挙型や構造体を使用することもできますが、今回はApple標準フレームワークのFoundationに含まれているNSErrorを使用していきます。

Swift2.0まではErrorTypeプロトコルを使用していましたが、Swift3.0からErrorプロトコルに変更されたので、注意してください。

エラーを発生させる

throwでエラーを投げる

エラーを発生させ、そのエラーの処理を呼び出し元に任せることを「エラーを投げる」といいます。

エラーを投げるには、throw文を使用します。

書き方:

NSErrorは、エラーが発生した箇所を特定するためのドメイン、エラーコード、任意の情報を指定してエラーを投げることができます。

throwsでメソッドを定義する

エラーを投げる可能性のあるメソッドは、メソッドの定義にthrowsキーワードを書きます。

書き方:

以下は、引数に空文字列が指定されたらエラーを投げるメソッドのサンプルです。

サンプルプログラム:

「text.isEmpty」は、textが空文字の場合にtrueを返します。

textが空文字の場合、「throw NSError(…)」でエラーを投げます

そのため、メソッドの定義にはthrowsキーワードが必要になります。

エラーを対処する

上の章のようにエラーを投げる可能性のあるメソッドを呼び出す側は、エラーを対処する必要があります。

do-catchとtryでエラーを受け取る

投げられたエラーを受け取り対処するには、do-catch構文を使用します。

書き方:

do節でエラーを投げる可能性のあるメソッドを呼び出します。

呼び出し時には、tryキーワードを書きます。

エラーが発生した場合の処理はcatch節に書きます。

以下は、上の章で作成したエラーを投げるメソッドを呼び出すサンプルです。

サンプルプログラム:

実行結果:

printTextメソッドはthrowsキーワードでエラーが発生する宣言がされているので、「try printText」のようにtryキーワードを使用します。

サンプルでは引数に空文字を指定しているので、エラーが発生し、catch節の処理が実行されています。

tryキーワードがなかったり、do-catch構文で囲われていないとコンパイルエラーになりますので注意してください。

try?とtry!でエラーを無視する

エラーを投げる可能性のあるメソッドでも、エラーを無視して呼び出すこともできます。

try?とは

tryキーワードに「?」をつけることで、エラーを無視することができます。

サンプルプログラム:

ここでは、printTextメソッドの呼び出しをdo-catch構文で囲っていませんが、コンパイルエラーになりません

実行するとエラーは発生しますが無視され、何も表示されません。

try!とは

tryキーワードに「!」をつけても、エラーを無視することができます。

ただし、「try!」はエラーが発生した場合に実行時エラー(クラッシュ)になります。

そのため、エラーが起こり得ないケースで使用するのに限られます。

エラーが発生しても行う処理

deferで処理を定義する

エラーが発生するとそこで処理が中断し、呼び出し元に戻ってしまいます。

処理が中断しても行いたい処理がある場合は、do-catch構文の中でdefer文を使用します。

用途はJavaやC#のfinally文と同じですが、tryでメソッドを呼び出す前に定義する点が異なります。

書き方:

メソッド呼び出しでエラーが発生しなかった場合はメソッド処理後、「処理3」→「処理2」→「処理1」の順で実行されます。

メソッド呼び出しでエラーが発生した場合はメソッド処理後、「処理3」は実行されず、「処理2」→「処理1」の順で実行されます。

サンプルです。

サンプルプログラム:

実行結果:

メソッド呼び出しでエラーが発生しているので、その後に記述しているdefer文は実行されていません。

まとめ

今回はエラー処理を記述する方法について解説しました。

実際のシステム構築ではエラーが発生した時に異常終了を避けるため、エラー処理はかかせません。

エラー処理を記述する方法を忘れてしまったら、この記事を思い出して下さい!

最短でプログラミングを習得したい方へ

元々ITリテラシーのある方やプログラムの学び方がわかっている方は独学で習得することも可能でしょう。

ただし、実際の学習期間中はつまづいている時間がほとんどです。

「もう挫折したくない」
「本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい。」
「自分だけのカリキュラムで効率的に勉強したい」

そんな方はお気軽に侍エンジニア塾までご相談ください。

弊社では、

  • プログラミング基礎学習
  • オリジナルアプリ開発
  • 仕事獲得

までをひと通り学習できます。

まずは無料体験レッスンで、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

挫折しない学び方や、通常1000時間以上かかる学習時間を1/3にする方法などより具体的なアドバイスもさせていただいています。

詳しくは下の画像をクリックして弊社サービス内容をご確認ください。

cta1

LINEで送る
Pocket

書いた人

せき

せき

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説