Swift エラーハンドリング入門|do-try-catchの基本
生徒
「Swiftのプログラムでエラーが出たとき、どうやって処理したらいいんですか?」
先生
「Swiftにはエラーハンドリングという仕組みがあって、do-try-catchという書き方で安全にエラーを処理できますよ。」
生徒
「do-try-catchって難しそうに聞こえますけど、初心者でも分かりますか?」
先生
「心配いりません。具体例を交えて、エラー処理の基本を一緒に見ていきましょう。」
1. Swiftのエラーハンドリングとは?
プログラムを書いていると、必ず「思い通りに動かない」場面が出てきます。例えばファイルが見つからなかったり、インターネットに接続できなかったり、数字をゼロで割ってしまったりといった問題です。これをプログラムの世界では「エラー」と呼びます。
Swiftでは、エラーが起きたときにプログラムが勝手に止まってしまうのを防ぐために「エラーハンドリング」という仕組みを用意しています。これは、エラーを「受け止める」方法だと考えてください。
2. do-try-catchの基本構造
Swiftでエラーを処理するときによく使うのがdo-try-catchです。これは日本語にすると「試してみて、もし失敗したら捕まえる」というイメージです。基本の形は次のようになります。
do {
try 関数や処理()
} catch {
print("エラーが発生しました: \(error)")
}
ここでtryは「この処理はエラーが出るかもしれないから注意して実行する」という意味です。そしてcatchは「もしエラーが出たら、ここで処理します」という部分です。
3. 簡単な例で理解する
例えば「数値を割り算する関数」を考えてみましょう。ゼロで割るとエラーになりますが、Swiftのエラーハンドリングを使えば安全に処理できます。
enum DivisionError: Error {
case divideByZero
}
func divide(_ a: Int, _ b: Int) throws -> Int {
if b == 0 {
throw DivisionError.divideByZero
}
return a / b
}
do {
let result = try divide(10, 0)
print("結果: \(result)")
} catch {
print("エラーが発生しました: \(error)")
}
エラーが発生しました: divideByZero
この例では、0で割ろうとしたときに「divideByZero」というエラーを投げて、catchで処理しています。これにより、プログラムが途中で強制終了するのを防げます。
4. エラーを投げるとは?
Swiftの関数で「エラーが起きる可能性がある」と伝えたいときは、throwsキーワードを使います。そして実際にエラーが起きたらthrowでエラーを「投げる」ことができます。
ここでいう「投げる」とは、問題が起きたことを外側に知らせるイメージです。そしてそのエラーは外側でcatchが「受け止める」わけです。
5. 複数のエラーを処理する
プログラムによっては、エラーが1種類だけではなく、いくつも発生する可能性があります。その場合、catchを使って条件ごとに処理を分けられます。
enum FileError: Error {
case notFound
case noPermission
}
func openFile(name: String) throws {
if name == "" {
throw FileError.notFound
} else if name == "secret.txt" {
throw FileError.noPermission
}
print("ファイルを開きました")
}
do {
try openFile(name: "secret.txt")
} catch FileError.notFound {
print("ファイルが見つかりません")
} catch FileError.noPermission {
print("ファイルを開く権限がありません")
} catch {
print("その他のエラー: \(error)")
}
ファイルを開く権限がありません
このようにすれば、状況に応じたエラーメッセージをユーザーに伝えることができます。
6. try? と try! の違い
Swiftでは、エラー処理を簡単にするための方法もあります。
try?:エラーが出たらnilを返してくれるので、安全に処理できます。try!:エラーが出ないと信じて強制的に実行します。ただし本当にエラーが出た場合はプログラムが止まってしまうので、初心者にはおすすめできません。
let safeResult = try? divide(10, 0)
print(safeResult) // nil
let forcedResult = try! divide(10, 2)
print(forcedResult) // 5
7. エラーハンドリングを使うメリット
Swiftでエラーハンドリングを使うと、プログラムが途中で止まるのを防ぎ、ユーザーに分かりやすいメッセージを表示できます。特にアプリ開発では、エラー処理があるかどうかでユーザー体験が大きく変わります。
例えば「ネットワークに接続できませんでした」とメッセージを出せば、ユーザーは「Wi-Fiが切れているのかも」と気づけます。逆に、何も説明がなければアプリが落ちたように見えてしまいます。