【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Flutter】httpパッケージとExceptionを使用したエラーハンドリングについて徹底解説!

【Flutter】httpパッケージとExceptionを使用したエラーハンドリングについて徹底解説!
いちの

こんばんは〜
弊社ブログに辿り着いていただきありがとうございます!
株式会社メモリアインクのいちのです

この記事を読んでわかること

  • Flutterのhttpパッケージを使用したエラーハンドリングの基本
  • Exceptionを使用したエラーハンドリングの方法
  • pubspec.yamlにhttpパッケージを追加する方法

開発環境

  • Dart 3.0.0
  • Flutter 3.10.0
  • http 1.2.1
目次

httpパッケージについて

httpパッケージは、FlutterアプリでHTTPリクエストを行うためのライブラリで、APIとの通信などに使用されます。

httpパッケージのセットアップ

概要

Flutterプロジェクトでhttpパッケージを使用するためには、まずpubspec.yamlファイルに依存関係を追加する必要があります。

サンプルコード

dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.1

pubspec.yamlファイルにこの依存関係を記述した後、ターミナルまたはコマンドプロンプトでflutter pub getコマンドを実行して、パッケージをプロジェクトにインストールします。

httpパッケージを使用したエラーハンドリング

概要

HTTPリクエストは様々な理由で失敗する可能性があります。ネットワークの不具合、サーバーのエラー、不正なリクエストなど、様々な原因が考えられます。これらのエラーを適切に処理することが重要です。

サンプルコード

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: _fetchData,
            child: Text('データを取得'),
          ),
        ),
      ),
    );
  }

  void _fetchData() async {
    final url = Uri.parse('https://example.com/data');
    try {
      final response = await http.get(url);
      if (response.statusCode == 200) {
        // ここでデータを処理
        print('データ取得成功: ${response.body}');
      } else {
        // サーバーからのエラーレスポンスを処理
        print('サーバーエラー: ${response.statusCode}');
      }
    } catch (e) {
      // ネットワークエラーを処理
      print('ネットワークエラー: $e');
    }
  }
}

サンプルコードの解説

  • 11-20行目: アプリのUIを定義しています。ここでは、中央に「データを取得」ボタンが配置されています。
  • 23-38行目: _fetchData関数は、非同期操作を行うためにasyncキーワードを使用して定義されています。この関数はHTTPリクエストを送信し、レスポンスを処理します。
  • 24行目: HTTP GETリクエストの送信先URLを定義しています。
  • 25-37行目: try-catchブロックを使用して、HTTPリクエストの送信とレスポンスの処理を行います。これにより、エラーを適切に捕捉し処理することができます。
  • 26行目: http.getメソッドを使用してHTTP GETリクエストを送信し、レスポンスを変数responseに格納しています。
  • 27-33行目: HTTPレスポンスのステータスコードを確認し、200の場合は成功と見なしてデータを処理します。それ以外の場合は、エラーメッセージをログに出力します。
  • 32行目:36行目: ネットワークエラーなどの例外を捕捉し、エラーメッセージをログに出力します。

Log(ログ)出力にご興味のある読者様。以下の記事で分かりやすく丁寧に解説しておりますので、ぜひご一読いただけますと幸いです。

Exceptionを使用したエラーハンドリング

概要

Exceptionを使用したエラーハンドリングでは、エラーの種類に応じてカスタム例外を投げることができます。これにより、エラーの原因をより詳細に特定しやすくなります。

サンプルコード

class ServerException implements Exception {
  final String message;
  ServerException(this.message);
}

class NetworkException implements Exception {
  final String message;
  NetworkException(this.message);
}

void _fetchData() async {
  final url = Uri.parse('https://example.com/data');
  try {
    final response = await http.get(url);
    if (response.statusCode == 200) {
      // ここでデータを処理
      print('データ取得成功: ${response.body}');
    } else {
      // サーバー例外を投げる
      throw ServerException('サーバーエラー: ${response.statusCode}');
    }
  } on NetworkException {
    // ネットワークエラーを処理
    print('ネットワークエラー');
  } catch (e) {
    // その他のエラーを処理
    print('エラー: $e');
  }
}

サンプルコードの解説

  • 1-9行目: ServerExceptionNetworkExceptionクラスを定義しています。これらはカスタム例外クラスで、エラーメッセージを含めることができます。
  • 11-29行目: _fetchData関数内で、HTTPリクエストを送信し、レスポンスに基づいて適切な例外を投げるか決定します。try-catchブロックを使用して、これらの例外を捕捉し処理します。
  • 20行目: ステータスコードが200以外の場合、ServerExceptionを投げます。これにより、サーバーエラーが発生したことを示します。
  • 22-28行目: on NetworkExceptionブロックを使用して、ネットワーク例外を特定して処理します。このブロックは、NetworkExceptionが投げられた場合にのみ実行されます。
  • 25-28行目: 予期せぬエラーを捕捉し、ログに出力します。これにはServerExceptionNetworkException以外の例外が含まれます。

まとめ

いかがでしたでしょうか?今回は、httpパッケージとExceptionを使用したエラーハンドリングについて、サンプルコードを用いて解説してみました。読者様の開発の手助けに少しでもなればいいなと思いこの記事を書かせていただいております。弊社ではAndroid、iOS、Flutterを使ったアプリ開発についてのブログを多数投稿させていただいておりますので、ご興味のある方はぜひ!

いちの

自分の成長を加速させるチャンスがどこかにあるかもしれません。
変化を恐れずに新たな環境に飛び込む勇気のある方は、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
をオススメします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次