Flutter 最佳实践篇之使用异常而非返回码

OldBird

实用Tips|2025-1-22|最后更新: 2025-1-22|
type
status
date
slug
summary
tags
category
icon
password
首先,我们用 Dart 语言来展示如何使用错误码异常机制处理错误。

两者使用示例

场景描述
假设你在开发一个银行转账系统,有以下错误场景:
  1. 账户 A 余额不足。
  1. 账户 B 不存在。
  1. 网络连接异常。

使用错误码处理

在 Dart 中,你可以通过返回错误码来表示不同的错误状态,调用者需要根据错误码判断并处理错误。
调用示例:
优点:
  • 简单直接:错误码方式较为简洁,调用者只需检查返回值并进行相应处理。
  • 性能较好:不涉及异常抛出,因此性能相对较高。
缺点:
  • 代码冗长:每个调用都需要手动检查错误码,代码变得冗长且易于出错。
  • 错误信息不足:错误码只能表示一种状态,不能提供更详细的错误信息。
  • 容易遗漏错误处理:如果忘记检查错误码,可能会导致错误没有被处理。

使用异常机制处理

现在我们来看使用异常机制的方式,异常机制通常会提供更丰富的错误信息,并且错误处理更加清晰。
调用示例:
优点:
  • 清晰的错误处理:通过 try-catch 机制,错误处理与正常逻辑分开,代码更加简洁。
  • 详细的错误信息:异常对象可以携带更详细的错误信息,帮助开发者理解错误发生的原因。
  • 不会遗漏错误:异常机制要求开发者处理每个可能的异常,避免了错误被忽视的风险。
缺点:
  • 性能开销:异常的创建和抛出有一定的性能开销,尤其是在错误频繁发生时,可能会影响性能。
  • 可能过度使用:如果异常滥用,会导致代码过于复杂,并且增加调试的难度。
前面的例子虽然展示了 try-catch 的基本使用,但没有很好地展示出它的优势,特别是在复杂的应用中如何帮助简化错误处理。让我们通过一个更复杂的例子来重新阐明 try-catch 相较于错误码的优势。

改进后的用例:银行转账系统

在这个例子中,我们将模拟更复杂的场景,并且展示如何通过异常机制来处理多个潜在的错误,尤其是嵌套调用集中管理错误的能力。
场景:
  1. 账户验证:验证账户是否存在。
  1. 余额检查:检查账户余额是否足够。
  1. 网络连接:在进行银行转账时检查网络是否可用。
  1. 转账服务:通过外部服务执行转账。
我们将展示两种处理方式:
  • 使用错误码
  • 使用异常机制

错误码方式

假设我们有多个子操作,比如账户验证、余额检查等,每个操作都会返回一个错误码。
调用示例:
为了处理错误,我们在每一层都需要显式地检查错误码。这会导致代码层次过深,且不容易维护。
优点:
  • 直接:每个错误都通过数字来标识,逻辑简单直接。
缺点:
  • 代码冗长且重复:每次都需要显式检查返回的错误码,尤其在多个子方法调用的情况下,错误码的传递会使代码变得冗长。
  • 难以追踪错误的具体位置:错误码无法提供具体的错误上下文或堆栈信息,难以追踪问题。
  • 层层判断和返回:每个步骤都需要手动判断错误码,代码不够优雅。

异常机制方式

使用异常机制时,我们不再依赖错误码,而是直接通过抛出异常来标识错误。
调用示例:
这样可以让每个错误的处理更加清晰,且不会在每层方法中重复判断。
优点:
  • 简洁清晰:通过 try-catch 机制,异常的处理与正常逻辑完全分开,使得代码更加简洁。
  • 易于维护:每种错误类型都有专门的异常类,能够提供详细的错误信息,便于后期的维护和调试。
  • 更好的错误追踪:异常机制能够提供堆栈信息,有助于开发者追踪错误来源。你不需要在每个方法中显式地返回错误码,并且不会遗漏任何错误。
  • 集中处理:在 catch 块中统一处理不同类型的异常,代码更加集中,易于管理。
缺点:
  • 性能开销:虽然异常机制提供了丰富的错误信息,但抛出和捕获异常会有一定的性能开销。虽然在大多数应用中这个开销是可以忽略的,但在高频繁的错误处理场景下可能会有影响。

总结:

特性
错误码方式
异常方式
可读性
需要层层判断错误码,代码冗长且易出错
try-catch 机制将错误和正常逻辑分开,代码简洁
错误信息
错误码无法提供详细的错误信息
异常提供详细的错误信息和堆栈跟踪信息
维护性
错误码管理复杂,修改错误信息需更改多个地方
异常类可独立管理,修改错误信息只需修改异常类
错误处理
每个步骤都需要检查错误码,增加了冗余
catch 块集中处理不同类型的错误,便于管理
通过这个更加复杂的用例,可以看到 异常机制 如何使得错误处理更加直观、简洁,且便于集中管理,尤其是在多层次、多个错误场景的情况下,try-catch 机制的优势尤为突出。
 
 
Loading...