🏃‍♀️

【Flutter】runZonedGuardedを使って、複数の非同期処理のエラーハンドリングをする

2023/07/25に公開

runZonedGuardedとは

アプリ内でエラーが発生した際にエラーハンドリングを行うための関数です。
https://api.flutter.dev/flutter/dart-async/runZonedGuarded.html

複数の非同期処理のエラーハンドリングをする

下記のコードは、3つの非同期処理をエラーハンドリングする処理です。
floatingActionButtonを押下すると、非同期処理が実行されます。

runZonedGuardedの第一引数は、エラーハンドリングされる処理です。
今回は、3つの非同期処理を実行しています。

また、runZonedGuardedの第二引数は、実際にエラーが発生した際に実行される処理です。
今回は、エラーのメッセージをターミナルに表示する処理を実行します。

main.dart
import 'dart:async';

import 'package:flutter/material.dart';

void main() {
  runApp(const MyWidget());
}

class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            runZonedGuarded(
              () {
                Future.delayed(const Duration(seconds: 1), () {
                  debugPrint('1つ目のAPIを実行');
                });
                Future.delayed(const Duration(seconds: 1), () {
                  debugPrint('2つ目のAPIを実行');
                  throw Exception('2つ目のAPIでエラーが発生');
                });
                Future.delayed(const Duration(seconds: 1), () {
                  debugPrint('3つ目のAPIを実行');
                });
              },
              (error, stack) {
                debugPrint(error.toString());
              },
            );
          },
        ),
      ),
    );
  }
}

上記のコードを実行してみると、ターミナルには下記の文が出力されます。

下記で分かることは、1つ目のAPIが実行されて、2つ目のAPIが実行されますが、2つ目のAPIでエラーが発生します。
Exceptionをthrowすることでエラーを検知し、runZonedGuardedの第二引数に記載されたエラーの際の処理が実行されました。
そうすることで、エラーのメッセージをターミナルで出力しています。

このように、runZonedGuardedは複数の処理をエラーハンドリングができます。

I/flutter (25085): 1つ目のAPIを実行
I/flutter (25085): 2つ目のAPIを実行
I/flutter (25085): Exception: 2つ目のAPIでエラーが発生
I/flutter (25085): 3つ目のAPIを実行

Discussion