コンテンツへスキップ

Swiftのエラーメッセージをみんなでユーザーフレンドリーにしよう

Swiftのエラーメッセージは意味不明なことが多いですが、コミュニティの力でもっとわかりやすくできます。より良い説明を提供して、他の開発者(そして未来の自分)を助けましょう。

Swiftのエラーメッセージをみんなでユーザーフレンドリーにしよう

Swiftはエレガントな設計を持つ言語ですが、システムのエラーメッセージは意味不明で役に立たないことが多いです。ただ不満を言うだけではなく、ErrorKit を作りました。これらのメッセージを人に優しい説明にマッピングするツールです。しかし、Appleのエコシステム全体をカバーするのは一人では大きすぎる仕事です――これはコミュニティの力が必要です。

この記事では、強化されたエラー記述のために構築した基盤を紹介し、Swift開発者のためのユーザーフレンドリーなエラーメッセージの包括的な辞書を一緒に作りましょうと呼びかけます。

システムエラーメッセージの問題

役に立たないシステムエラーメッセージの実例を見てみましょう:

// File system error
"The file couldn't be opened because it doesn't exist."
// Better message: "The file 'report.pdf' could not be found. Please verify the file name and location."

// Core Data error
"The operation couldn't be completed. (Cocoa error 133000.)"
// Better message: "The database has a validation error. One or more required fields are empty or have invalid values."

これらのデフォルトメッセージにはいくつかの問題があります:

  1. エンドユーザーにとって技術的すぎることが多い

  2. 何を試みていたかのコンテキストが不足している

  3. 問題の解決方法に関する提案がほとんどない

  4. 単に間違っているか、誤解を招くこともある

  5. ユーザーに見せるべきでない実装の詳細が露出することがある

Appleには数十のフレームワークにまたがる何千ものエラーコードがあり、その多くは何十年も前から存在しています。新しいAPIは改善されていますが、古いフレームワークの多くは依然として開発者向けに設計されたメッセージを返しており、ユーザー向けではありません。

解決策:コミュニティによるエラーマッピング

ErrorKitは、システムエラーをより分かりやすいメッセージにマッピングする userFriendlyMessage(for:) 関数を提供します:

do {
    let data = try Data(contentsOf: url)
    // Process data...
} catch {
    // Instead of showing the default message
    // showAlert(error.localizedDescription)

    // Show an enhanced message
    showAlert(ErrorKit.userFriendlyMessage(for: error))
}

内部的には、この関数がエラーを分析し、増え続ける既知のエラー型のセットに基づいてより良い説明を返します:

// Example from ErrorKit's implementation
enum FoundationErrorMapper: ErrorMapper {
    static func userFriendlyMessage(for error: Error) -> String? {
        let nsError = error as NSError

        // URL loading errors
        if nsError.domain == NSURLErrorDomain {
            switch nsError.code {
            case NSURLErrorNotConnectedToInternet:
                return String(localized: "You are not connected to the Internet. Please check your connection.")
            case NSURLErrorTimedOut:
                return String(localized: "The request timed out. Please try again later.")
            // Many more cases...
            }
        }

        // File system errors
        if nsError.domain == NSCocoaErrorDomain {
            switch nsError.code {
            case NSFileNoSuchFileError:
                return String(localized: "The file could not be found.")
            // Many more cases...
            }
        }

        // More domains and error codes...

        return nil // Fall back to default handling
    }
}

現在のカバー範囲と例

ErrorKitには、Appleの主要フレームワークにわたる一般的なエラーのマッピングが含まれています:

Foundation

  • ネットワーク:NSURLErrorNotConnectedToInternet → 「お使いのデバイスはインターネットに接続されていません。接続を確認してもう一度お試しください。」

  • ファイルシステム:NSFileNoSuchFileError → 「ファイル ‘report.pdf’ が見つかりませんでした。ファイル名と場所を確認してください。」

Core Data

  • バリデーション:NSValidationErrorMinimum → 「データベースのバリデーションに失敗しました。入力内容を確認してもう一度お試しください。」

  • ストア管理:NSPersistentStoreCoordinatorError → 「データベースエラーです。最近のアプリアップデートまたはファイルの破損が原因の可能性があります。」

MapKit

  • 経路案内:MKErrorDirectionsNotFound → 「リクエストされたルートの経路が見つかりませんでした。」

  • 位置情報:MKErrorLocationUnknown → 「現在地を取得できません。位置情報の権限を確認してください。」

なぜコミュニティの力が必要なのか

理想的には、Appleがすべての紛らわしいエラーメッセージを修正してくれるでしょう。実際、改善は進んでいます――SwiftUIのような新しいフレームワークはずっとわかりやすくなっています。しかし、何十年にもわたるレガシーAPIには、意味不明で技術的なメッセージが今後も手つかずのまま残る可能性があります。

ここでコミュニティが大きなインパクトを与えられます。一人の開発者がすべての難解なエラーに遭遇することはありませんが、みんなを合わせれば、ほとんどのエラーを経験しています。すでに解読したことを共有し、これらのメッセージを平易な言葉で書き直すことで、すべての人の時間を節約し、開発者とユーザーの両方の体験を向上させるリソースを作ることができます。

貢献する方法

システムエラーメッセージをより分かりやすく書き直した経験があるなら、すでにその作業をしています――あとはそれを共有するだけです。一般的な3つのステップはこうです:

  1. 分かりにくいメッセージを見つける
    エラードメインとコード、それを引き起こした操作、そして userInfo 辞書からの有用な情報をメモします。

  2. より良いバージョンを書く
    平易な言葉を使い、具体的に。意味がある場合は、次にやるべきことを提案します。

  3. GitHubで提出する
    ErrorKitのリポジトリにプルリクエストまたはissueを作成し、改善されたメッセージ、元のコンテキスト、メモを添えてください。

小さな貢献でも何千人もの開発者を助け、何百万人ものユーザー体験を改善することができます!

Appleフレームワークを超えて:あらゆるライブラリのエラーマッピング

Appleフレームワークが主なターゲットですが、ErrorKitのエラーマッピングシステムはあらゆるエラー型に対応しています。ErrorMapper プロトコルを使えば、サードパーティライブラリのカスタムマッピングを作成できます:

// Example mapper for Alamofire networking errors
enum AlamofireErrorMapper: ErrorMapper {
    static func userFriendlyMessage(for error: Error) -> String? {
        switch error {
        case let afError as Alamofire.AFError:
            switch afError {
            case .sessionTaskFailed(let underlying):
                if let urlError = underlying as? URLError {
                    switch urlError.code {
                    case .notConnectedToInternet:
                        return String(localized: "Your device isn't connected to the internet. Please check your connection and try again.")
                    case .timedOut:
                        return String(localized: "The server took too long to respond. Please try again later.")
                    default:
                        return nil
                    }
                }
                return nil
            case .responseValidationFailed(let reason):
                if case .unacceptableStatusCode(let code) = reason {
                    return String(localized: "The server returned error \(code). Please check your request or try again later.")
                }
                return nil
            default:
                return nil
            }
        default:
            return nil
        }
    }
}

// Register for immediate use
ErrorKit.registerMapper(AlamofireErrorMapper.self)

この拡張性により、以下のような可能性が広がります:

  • Alamofireのような人気ライブラリに対するカスタムマッピングをアプリ内に追加

  • Stripe、AdmobなどのクローズドソースSDK用のマッパーパッケージの作成

  • チームや組織内でのエラーマッピングの共有

まとめ

エラーメッセージはユーザー体験に大きな影響を与えるにもかかわらず、開発において見過ごされがちです。ErrorKitの userFriendlyMessage(for:) 関数は、コミュニティのコラボレーションを通じてこれを変革するフレームワークを作ります。開発者が知識を持ち寄り、Swiftエコシステム全体をよりユーザーフレンドリーにするためのフレームワークです。

意味不明なエラーメッセージを解読した経験があるなら、その知見は貴重です。ErrorKitに貢献することで、自分だけでなく、同じ課題に直面するすべてのSwift開発者のために問題を解決できます。ErrorKitをチェックして、このコミュニティリソースを一緒に築きましょう:

github.comFlineDev / ErrorKitSimplified error handling with built-in user-friendly messages for common errors. Fully localized. Community-driven

Appleフレームワークで意味不明なエラーメッセージに遭遇したことはありますか?それをもっと分かりやすくした経験はありますか?ぜひソーシャルメディア(リンクは下記)で教えてください!

このシリーズの前の記事:

  1. Swiftのエラー処理を正しく行う:Objective-Cの負の遺産を乗り越える

  2. Swift 6のTyped Throwsの真の力をError Chainで引き出す

  3. Swiftアプリのエラーレポートを改善する:自動ログ+アナリティクス

この記事が参考になりましたか?BlueskyMastodonでフォローして、Swiftのヒントやインディー開発の最新情報をチェックしてください。