Flutter错误处理插件error_or的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter错误处理插件error_or的使用

ErrorOr 是一个用于返回结果的类型,它可以包含一个值 T 或者一个错误 Object。这个插件提供了一种更简洁的方式来处理可能抛出异常的函数,避免了在每个地方都使用 try/catch 语句。

功能特性

  • 替代异常处理:通过包装一个可能抛出异常的函数,将其转换为返回 ErrorOr 的函数,从而避免直接使用 try/catch
  • 明确的错误处理:可以更明确地定义一个可能返回错误的函数,而不需要每次都使用 try/catch
  • 支持异步和同步函数ErrorOr 可以用于处理同步和异步函数。

API介绍

  • 创建 ErrorOr 实例:可以通过 ErrorOr.value()ErrorOr.error() 工厂构造函数来创建 ErrorOr 实例。
  • 检查是否有错误或值:使用 hasErrorhasValue 方法来检查 ErrorOr 中是否包含错误或值。如果在没有正确检查的情况下调用 errorvalue,会抛出 ErrorOrTypeError
  • 便捷的 wrap 方法ErrorOr.wrap 方法会自动处理 try/catch 逻辑,并返回一个 FutureOr,因此可以用于同步和异步函数。

示例代码

以下是一个完整的示例,展示了如何在 Flutter 项目中使用 ErrorOr 插件进行错误处理。

import 'dart:async';
import 'dart:math';

import 'package:error_or/error_or.dart';

// 模拟一个可能抛出异常的同步函数
String maybeThrows() {
  if (Random().nextBool() == false) {
    throw Exception('Error');
  }
  return 'Success';
}

// 使用 ErrorOr 包装同步函数
ErrorOr<String> maybeErrorSync() {
  if (Random().nextBool() == false) {
    return ErrorOr.error(Exception('Error'));
  }
  return ErrorOr.value('Success');
}

// 模拟一个可能抛出异常的异步函数
final delay = Duration(milliseconds: 400);

Future<String> getValueOrThrows() async {
  await Future.delayed(delay);
  return maybeThrows();
}

// 使用 ErrorOr 包装异步函数
Future<ErrorOr<String>> getValueOrError() async {
  await Future.delayed(delay);
  return ErrorOr.wrap(maybeThrows);
}

// 使用 then 和 catchError 进行错误处理
Future<void> errorHandlingWithThenAndCatchError() async {
  print('* Error handling with then and catchError');
  final completer = Completer();
  getValueOrThrows().then((String value) {
    print(value);
  }).catchError((e) {
    print(e);
  }).whenComplete(() {
    print('');
    completer.complete();
  });
  return completer.future;
}

// 使用 await 和 try/catch 进行错误处理
Future<void> errorHandlingWithAwaitAndTryCatch() async {
  print('* Error handling with await and try/catch');
  try {
    final String value = await getValueOrThrows();
    print(value);
  } catch (e) {
    print(e);
  }
  print('');
}

// 使用 ErrorOr 进行错误处理(异步)
Future<void> errorHandlingWithErrorOr() async {
  print('* Error handling with ErrorOr');
  final ErrorOr<String> errorOr = await getValueOrError();
  if (errorOr.hasError) {
    print(errorOr.error); // 如果有错误,打印错误信息
  } else {
    print(errorOr.value); // 如果没有错误,打印返回的值
  }
  print('');
}

// 使用 ErrorOr 进行错误处理(同步)
void errorHandlingWithErrorOrSync() {
  print('* Error handling with ErrorOr sync');
  final ErrorOr<String> errorOr = maybeErrorSync();
  if (errorOr.hasError) {
    print(errorOr.error); // 如果有错误,打印错误信息
  } else {
    print(errorOr.value); // 如果没有错误,打印返回的值
  }
  print('');
}

// 演示 ErrorOrTypeError 的抛出
Future<void> errorHandlingWithErrorOrTypeError() async {
  print('* Error handling with ErrorOr throws ErrorOrTypeError');
  try {
    final ErrorOr<String> errorOr = await getValueOrError();
    print(errorOr.value); // 如果没有检查 hasError 直接调用 value,会抛出 ErrorOrTypeError
  } on ErrorOrTypeError catch (e) {
    print(e.message); // 打印 ErrorOrTypeError 的错误信息
  }
  print('');
}

void main() async {
  await errorHandlingWithThenAndCatchError();
  await errorHandlingWithAwaitAndTryCatch();
  await errorHandlingWithErrorOr();
  errorHandlingWithErrorOrSync();
  await errorHandlingWithErrorOrTypeError();
}

更多关于Flutter错误处理插件error_or的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误处理插件error_or的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在处理Flutter应用中的错误时,error_or 插件提供了一种优雅的方式来处理可能失败的操作。这个插件允许你返回一个 ErrorOr<T> 类型,它要么是成功的结果 T,要么是错误信息。下面是如何在Flutter应用中使用 error_or 插件的一个示例代码案例。

首先,你需要在你的 pubspec.yaml 文件中添加 error_or 依赖:

dependencies:
  flutter:
    sdk: flutter
  error_or: ^x.y.z  # 请替换为最新的版本号

然后运行 flutter pub get 来获取依赖。

接下来,我们来看一个使用 error_or 的简单示例。假设我们有一个函数,它尝试从一个API获取数据,如果成功则返回数据,如果失败则返回错误信息。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ErrorOr Usage Example'),
        ),
        body: Center(
          child: FutureBuilder<ErrorOr<Map<String, dynamic>>>(
            future: fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                final result = snapshot.data;
                if (result?.isOk ?? false) {
                  // 处理成功的数据
                  return Text('Data: ${jsonEncode(result.value)}');
                } else {
                  // 处理错误信息
                  return Text('Error: ${result.error.message}');
                }
              }
            },
          ),
        ),
      ),
    );
  }
}

Future<ErrorOr<Map<String, dynamic>>> fetchData() async {
  try {
    final response = await http.get(Uri.parse('https://api.example.com/data'));

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body) as Map<String, dynamic>;
      return ErrorOr.ok(data);
    } else {
      return ErrorOr.error(ErrorOrError('Failed to fetch data, status code: ${response.statusCode}'));
    }
  } catch (e) {
    return ErrorOr.error(ErrorOrError('An error occurred: $e'));
  }
}

class ErrorOrError {
  final String message;

  ErrorOrError(this.message);
}

在这个示例中:

  1. 我们定义了一个 fetchData 函数,它尝试从一个API获取数据。如果请求成功且状态码为200,则返回 ErrorOr.ok(data),否则返回 ErrorOr.error(ErrorOrError('...'))
  2. ErrorOrError 是一个简单的自定义错误类,用于封装错误信息。
  3. MyApp 组件中,我们使用 FutureBuilder 来异步获取数据,并根据返回的结果类型(成功或错误)来显示不同的UI。

这种方式使得错误处理更加明确和易于管理,同时保持了代码的整洁和可读性。

回到顶部