46
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift 2で追加されたエラーハンドリング

Last updated at Posted at 2015-06-09

Swift 2では新しいエラーハンドリング機構が追加されました。他言語でいうところの例外処理のようなものです。

エラーを投げる (throw)

まず、下記のようにしてエラーを定義します。エラーはErrorTypeを継承している必要があります。

enum MyError: ErrorType {
    case UnexpectedError
}

実際にエラーが発生する場所では、下記のようにthrowを使ってさきほど定義したエラーを投げます。

func myfunc() throws {
    throw MyError.UnexpectedError
}

このとき、myfunc()throwsと修飾されている点に注意してください。throwを使ってエラーを投げる場合、これがないとコンパイルエラーとなります。また、ErrorTypeを継承していないものを投げようとする場合にもコンパイルエラーになります。

エラーを受け取る (do/try/catch)

throwsで修飾された関数を呼び出す場合、呼び出し側でエラーハンドリング処理を準備しなければなりません。

エラーハンドリングを行うには、下記のようにdo句のなかでエラーが発生しうる関数にtryをつけて呼び出します。

do {
    try myfunc()
}
catch MyError.UnexpectedError {
    print("caught")
}

throwsで修飾されている関数を呼び出す場合、このtryがないとコンパイルエラーになります。逆に、throwsで修飾されていない関数にtryをつけて呼び出しても、警告は出ますがコンパイルエラーにはなりません。

エラーが発生すると、対応するcatch句が実行されます。発生しうるエラーに対して対応するcatch句が揃っていない場合、コンパイルエラーになります(が、現時点のBetaではmain()内に書いた場合はコンパイルエラーにならないようです)。

tryつき呼び出しをdo句の外で行ってもコンパイルエラーになりますが、これも現時点のBetaではmain()内に書いた場合にはコンパイルエラーにならないようです。

引数つきエラー

下記のように、エラーには引数をつけることができます。エラーの引数はcatch句で受け取ることができます。

enum MyError: ErrorType {
    case UnexpectedError
    case CountError(count: Int)
}

func thrower(c: Int) throws {
    if c > 0 {
        throw MyError.CountError(count: 2)
    }
    else {
        throw MyError.UnexpectedError
    }
}

do {
    try thrower(10)
} catch MyError.UnexpectedError {
    print("unexpected")
} catch MyError.CountError(let count) {
    print(count)
}

main()内ではこのようなドキュメント通りの記述ができますが、現時点のBetaでは関数内に記述する場合に、このような複数のエラータイプがあるケースですべてのタイプを網羅するcatch句を書いてもコンパイルエラーになるケースがあるようです(コメント欄参照)。

エラーを無視する

throwsで修飾されている関数を呼び出す際、絶対にエラーが発生しないことがわかっている場合には、下記のようにtry!をつけることでエラーハンドリング処理を実装せずに呼び出すことができます。

try! myfunc()

このような呼び出し方をした場合にエラーが発生すると、アプリケーションはクラッシュします。

おわりに

Swift 2で新しく追加されるエラーハンドリング処理について記述しましたが、現時点(Xcode 7.0 Beta 7A120f)ではコンパイラの挙動が不安定で、通るはずのないコードがコンパイルを通ってしまったり、またその逆もあったりします。Swift自体がよく仕様が変わる言語なので、常に最新のドキュメントを参照するようにしましょう。

46
46
2

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
46
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?