見出し画像

[Flutter]httpパッケージを使ったエラーハンドリング

Flutterアプリ開発において、HTTPリクエスト、レスポンスで発生するエラーを処理する方法についてご紹介します。

そもそもエラーハンドリングとは何でしょうか?定義はこちら。

エラーハンドリングとは、プログラムの処理中に処理が妨げられる事象が発生した際、その処理をエラーとして対処する処理のことである。
例外処理とも呼ばれる。

https://japan.zdnet.com/glossary/exp/%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0/?s=4#:~:text=%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0,%E3%81%93%E3%81%A8%E3%81%8C%E8%A6%81%E5%9B%A0%E3%81%A8%E3%81%AA%E3%82%8B%E3%80%82

このエラーハンドリングの手法はいくつかあり、自分がよく使うのはtry-catchを使う方法です。
try{}でエラーが発生したら処理を止めて、catch{}の処理を実行するようにします。以下コードではtryでエラーが出たら処理を止め、catchで_showPostDialogを呼び出してダイアログを表示し、アプリのユーザーにエラーが出ましたよ、ということを伝えることができます。
エラーが起きた時にユーザーに何らかのアクションを起こさないと、なぜエラーが起きたのか、エラーが起きたあとどうしたらいいのかを伝えられず、ストレスを与えてしまうことになるので、こういう処理は重要です。

void _showPostDialog(String title) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return PostDialog(title: title);
      },
    );
  }

try {
   //何らかの処理を実施
} catch (e) {
   //try内で発生したエラーをcatchする
print(e);
   //発生したエラーの内容をprintしてterminalで確認
_showPostDialog("エラーが発生しました $e");
   //エラーが発生したことをダイアログで画面に表示
  }
}

Flutterアプリでhttp通信を行う際にも、httpパッケージを使えば簡単にエラーハンドリングができるんです。

まずはpubspec.yamlに以下を追加

dependencies:
  http: ^0.13.5 //最新バージョン

エラーハンドリングを行うファイルに以下をインポート

import 'dart:convert';
import 'dart:async';
import 'package:http/http.dart' as http;

void main()でhttpのエラーハンドリングを行うfetchData()メソッドを実行します。以下コード解説。

void main() {
  fetchData();
}

Future<void> fetchData() async {
  final String url = 'https://api.example.com/data';
  try {
    final response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      var data = jsonDecode(response.body);
      print('Data: $data');
    } else {
      throw Exception('Failed to load data');
    }
  } on http.ClientException catch (e) {
    print('Network error: $e');
  } catch (e) {
    print('Unknown error: $e');
  }
}

fetchData()
'https://api.example.com/data'というUrlをString型で格納。
その下からtry-catchを実行。

final response = await http.get(Uri.parse(url));
Uri型に変換したurlを使ってHTTP GETリクエストを投げ、返ってきたレスポンスをfinal responseに格納します。

if (response.statusCode == 200)
statusCodeが200のレスポンスが返ってきた、つまりGETリクエストが成功した場合、print('Data: $data');を実行。

on http.ClientException catch (e)
HTTPリクエスト/レスポンスでエラーが発生したら、on http.ClientException catch (e)で print('Network error: $e');が実行される

という流れになっています!

いいなと思ったら応援しよう!