Flutter异常转换插件codenic_exception_converter的使用

Flutter异常转换插件codenic_exception_converter的使用

介绍

codenic_exception_converter 是一个实用工具,用于将异常转换为失败对象(Failure objects)。通过将异常转换为失败对象,程序可以以更通用的方式处理异常,而不是被特定技术或框架的具体细节所束缚。这使得编写代码更加便携和易于维护,因为它不依赖于任何特定技术的具体细节。

以下是关于如何使用 codenic_exception_converter 插件的完整示例 demo。

示例图片

Codenic Exception Converter

Codenic

完整示例 Demo

// ignore_for_file: avoid_print

import 'dart:io';

import 'package:codenic_exception_converter/codenic_exception_converter.dart';

Future<void> main() async {
  // To run, type `dart --enable-asserts example/main.dart`.

  await _observeWithDefaultConverters();
  print('');
  await _observeWithArgConverters();
  print('');
  await _observeNoExceptionConverters();
  print('');
  _convert();
}

/// 使用默认的异常转换器观察任务
Future<void> _observeWithDefaultConverters() async {
  // 创建一个异常转换器套件,可以将 `SocketException` 转换为 `NetworkFailure`
  final exceptionConverterSuite = ExceptionConverterSuite(
    defaultErrorConverters: [SocketExceptionConverter.new], // 设置默认的异常转换器
  );

  final result = await exceptionConverterSuite.observe<void>(
    messageLog: MessageLog(id: 'observe-with-default-converters'), // 日志ID
    printOutput: true, // 是否打印输出
    task: (messageLog) {
      // 模拟异常
      throw const SocketException('test');
    },
  );

  print('Observe (with default converters): $result'); // 打印结果
}

/// 使用参数提供的异常转换器观察任务
Future<void> _observeWithArgConverters() async {
  final exceptionConverterSuite = ExceptionConverterSuite();

  final result = await exceptionConverterSuite.observe<void>(
    messageLog: MessageLog(id: 'observe-with-argument-converters'), // 日志ID
    errorConverters: [const SocketExceptionConverter()], // 提供异常转换器作为参数
    printOutput: true, // 是否打印输出
    task: (messageLog) {
      // 模拟异常
      throw const SocketException('test');
    },
  );

  print('Observe (with argument exception converters): $result'); // 打印结果
}

/// 不使用异常转换器观察任务
Future<void> _observeNoExceptionConverters() async {
  final exceptionConverterSuite = ExceptionConverterSuite();

  final result = await exceptionConverterSuite.observe<void>(
    messageLog: MessageLog(id: 'observe-with-no-exception-converters'), // 日志ID
    task: (messageLog) {
      try {
        // 模拟异常
        throw const SocketException('test');
      } on SocketException {
        return const Left(NetworkFailure()); // 返回左值,表示失败
      }
    },
  );

  print('Observe (no exception converter): $result'); // 打印结果
}

/// 直接转换异常
void _convert() {
  final exceptionConverterSuite = ExceptionConverterSuite(
    defaultErrorConverters: [SocketExceptionConverter.new], // 设置默认的异常转换器
  );

  final result = exceptionConverterSuite.convert(
    error: const SocketException('test'), // 异常对象
    errorConverters: [const SocketExceptionConverter()], // 提供异常转换器
  );

  print('Convert result: $result'); // 打印结果
}

/// 网络失败类,继承自 Failure
class NetworkFailure extends Failure {
  const NetworkFailure({super.message = 'A network failure occurred'}); // 默认消息
}

/// 自定义异常转换器,将 `SocketException` 转换为 `NetworkFailure`
final class SocketExceptionConverter<T> extends ExceptionConverter<SocketException, T> {
  const SocketExceptionConverter();

  [@override](/user/override)
  Failure convert(SocketException exception) => const NetworkFailure(); // 将异常转换为失败对象

  [@override](/user/override)
  void logError(
    SocketException exception,
    StackTrace stackTrace,
    CodenicLogger logger,
    MessageLog messageLog,
  ) =>
      logger.error(messageLog, error: exception, stackTrace: stackTrace); // 记录错误日志
}

更多关于Flutter异常转换插件codenic_exception_converter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异常转换插件codenic_exception_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用codenic_exception_converter插件的示例代码。这个插件通常用于将异常转换为更易于管理和理解的格式。假设你已经在pubspec.yaml文件中添加了该依赖项,并运行了flutter pub get

1. 添加依赖项

首先,确保你的pubspec.yaml文件中包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  codenic_exception_converter: ^最新版本号 # 替换为实际的最新版本号

2. 导入插件

在你的Dart文件中导入codenic_exception_converter插件:

import 'package:codenic_exception_converter/codenic_exception_converter.dart';

3. 使用示例

下面是一个简单的使用示例,展示如何将一个普通的Dart异常转换为CodenicException对象,并提取有用的信息:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Codenic Exception Converter Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              try {
                // 模拟一个异常
                throw Exception('Something went wrong!');
              } catch (e, stackTrace) {
                // 将异常转换为CodenicException
                CodenicException codenicException = CodenicExceptionConverter.convert(e, stackTrace);
                
                // 输出异常信息
                print('Error Code: ${codenicException.errorCode}');
                print('Error Message: ${codenicException.message}');
                print('Stack Trace: ${codenicException.stackTrace}');
                
                // 你可以在这里进行其他的错误处理逻辑,比如显示Snackbar或Dialog
                // showDialog(context: context, builder: (context) => ErrorDialog(codenicException));
              }
            },
            child: Text('Throw Exception'),
          ),
        ),
      ),
    );
  }
}

// 假设你有一个ErrorDialog来显示错误信息
// class ErrorDialog extends StatelessWidget {
//   final CodenicException exception;
//
//   ErrorDialog({required this.exception});
//
//   @override
//   Widget build(BuildContext context) {
//     return AlertDialog(
//       title: Text('Error'),
//       content: Text('${exception.message}\n\nStack Trace: ${exception.stackTrace}'),
//       actions: <Widget>[
//         ElevatedButton(
//           onPressed: () {
//             Navigator.of(context).pop();
//           },
//           child: Text('OK'),
//         ),
//       ],
//     );
//   }
// }

4. 自定义异常转换

如果你需要自定义异常转换逻辑,你可以扩展CodenicExceptionConverter类,并重写convert方法。例如:

class MyCustomExceptionConverter extends CodenicExceptionConverter {
  @override
  CodenicException convert(Object exception, StackTrace stackTrace) {
    if (exception is MySpecificException) {
      // 自定义转换逻辑
      return CodenicException(
        errorCode: 'MY_SPECIFIC_ERROR',
        message: exception.message,
        stackTrace: stackTrace.toString(),
      );
    }
    // 调用父类的convert方法处理其他类型的异常
    return super.convert(exception, stackTrace);
  }
}

// 假设你有一个自定义异常类
class MySpecificException implements Exception {
  final String message;

  MySpecificException(this.message);
}

// 使用自定义转换器
void useCustomConverter() {
  try {
    throw MySpecificException('This is a specific error!');
  } catch (e, stackTrace) {
    CodenicException codenicException = MyCustomExceptionConverter().convert(e, stackTrace);
    print('Custom Error Code: ${codenicException.errorCode}');
    print('Custom Error Message: ${codenicException.message}');
  }
}

以上代码展示了如何在Flutter项目中使用codenic_exception_converter插件进行异常转换和处理。希望这对你有所帮助!

回到顶部