Flutter Laravel异常处理插件laravel_exception的使用

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

Flutter Laravel异常处理插件laravel_exception的使用

简介

Laravel Exception 是一个Flutter包,旨在简化与Laravel API交互时遇到的异常处理。它帮助开发者快速识别和处理来自Laravel后端的不同类型的HTTP异常,如验证错误、未找到资源或服务器内部错误。

动机

  • 由于我们几乎每天都在使用由Laravel构建的API
  • 我创建了这个包来轻松包装Laravel可能抛出的验证异常、未找到异常和服务器内部错误异常
  • 您可以轻松知道哪些字段被拒绝或验证失败,并在验证失败时获取错误信息
  • 在Laravel调试模式下,您可以轻松提取带有堆栈跟踪的消息
  • 同时,您也可以根据需要构建自定义异常

内容

类概述

  • LaravelException 抽象类:用于解析Laravel响应。
  • LValidationException 类:用于处理HTTP状态码为422(未处理实体)的情况。可以通过构造函数创建对象。
  • LServerException 类:用于处理HTTP状态码为500(服务器内部错误)的情况。通过parse(Map)工厂方法创建对象。
  • LNotFoundException 类:用于处理HTTP状态码为404(未找到)的情况。同样通过parse(Map)工厂方法创建对象。

示例代码

下面是一个完整的示例demo,展示了如何在Flutter应用中使用laravel_exception包来处理不同类型的异常:

import 'package:laravel_exception/laravel_exception.dart';
import 'package:http/http.dart' as http;

void main() async {
  // 假设这是从您的Laravel API获取的响应
  final response = await http.get(Uri.parse('https://example.com/api/resource'));

  if (response.statusCode == 422) {
    // 验证错误异常
    throw LValidationException.fromResponse(response);
  } else if (response.statusCode == 500) {
    // 服务器内部错误异常
    throw LServerException.parse(http.jsonDecode(response.body));
  } else if (response.statusCode == 404) {
    // 未找到异常
    throw LNotFoundException.parse(http.jsonDecode(response.body));
  }

  // 如果没有异常,则正常处理响应数据
  print('请求成功');
}

注意事项

当前版本的laravel_exception包还在开发中,未来计划添加以下特性:

  • ✅ dio拦截器支持(已实现)
  • ✅ 日志记录功能(已实现)

请持续关注此包的更新,以获得更多功能和支持。

希望上述内容能帮助您更好地理解和使用laravel_exception包。如果您有任何问题或建议,请随时联系我!


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

1 回复

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


当然,作为一个IT专家,我可以为你提供一个关于如何在Flutter项目中集成并使用laravel_exception插件来处理Laravel后端异常的示例。laravel_exception插件通常用于捕获和处理从Laravel后端返回的异常,以便在Flutter前端更好地展示错误信息。

首先,你需要确保已经在Flutter项目中添加了laravel_exception依赖。在pubspec.yaml文件中添加以下依赖:

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

然后运行flutter pub get来安装依赖。

接下来,你需要配置Laravel后端以返回适当的异常信息。在Laravel中,你可以在app/Exceptions/Handler.php文件中处理异常,并返回JSON格式的错误信息:

// 在 app/Exceptions/Handler.php 文件中

use Throwable;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;

class Handler extends ExceptionHandler
{
    // ...

    protected function unauthenticated($request, Throwable $exception)
    {
        return response()->json([
            'message' => 'Unauthenticated.',
            'error' => $exception->getMessage(),
        ], Response::HTTP_UNAUTHORIZED);
    }

    // 可以根据需要重写其他方法以返回统一的JSON格式错误信息
    protected function render($request, Throwable $exception)
    {
        if ($request->wantsJson()) {
            return response()->json([
                'message' => $exception->getMessage(),
                'code' => $exception->getCode(),
                'file' => $exception->getFile(),
                'line' => $exception->getLine(),
            ], $this->mapExceptionStatusCode($exception));
        }

        return parent::render($request, $exception);
    }

    // ...
}

现在,让我们在Flutter前端使用laravel_exception插件来处理这些异常。以下是一个简单的示例,展示了如何使用laravel_exception来捕获和处理从Laravel后端API调用中返回的异常:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Laravel Exception Handling Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final response = await http.get(Uri.parse('https://your-laravel-api-endpoint.com/some-endpoint'));
                if (response.statusCode == 200) {
                  // 处理成功响应
                  print('Success: ${response.body}');
                } else {
                  // 处理非200响应(这里通常Laravel也会返回JSON格式的错误信息)
                  throw HttpException('Failed to load data', response);
                }
              } catch (e) {
                // 使用laravel_exception处理异常
                final exception = LaravelException.fromJson(e.response?.body ?? '{}');
                showDialog(
                  context: context,
                  builder: (context) => AlertDialog(
                    title: Text('Error'),
                    content: Text(exception.message ?? 'Unknown error'),
                    actions: <Widget>[
                      TextButton(
                        onPressed: () => Navigator.of(context).pop(),
                        child: Text('OK'),
                      ),
                    ],
                  ),
                );
              }
            },
            child: Text('Fetch Data from Laravel API'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,当点击该按钮时,它会尝试从Laravel API获取数据。如果API调用失败(例如,由于认证失败或服务器错误),我们将捕获异常并使用laravel_exception插件解析异常信息,然后在对话框中显示错误信息。

请注意,laravel_exception.fromJson方法假设从Laravel后端返回的是JSON格式的错误信息,这与我们在Laravel的Handler.php中配置的一致。如果Laravel返回的错误信息格式不同,你可能需要调整fromJson方法的解析逻辑。

希望这个示例能帮助你更好地理解如何在Flutter项目中集成和使用laravel_exception插件来处理Laravel后端的异常。

回到顶部