如何在Dart中捕获特定参数值匹配的NoFirestoreDataException自定义异常?
实现单一自定义异常的精准捕获逻辑
当然没问题!你完全可以用现有的NoFirestoreDataException这一个自定义异常类型实现需求,根本不用新增额外的异常类来增加代码复杂度。给你几个实用的实现思路:
方法1:在catch块内直接做类型匹配判断
这是最直接的方式,捕获异常后先检查它的dataType是否和你预期的一致,一致就优雅处理,不一致就重新抛出异常(让上层处理或者直接暴露问题,方便调试)。
示例代码:
try { // 执行获取User数据的Firestore查询 User targetUser = firestoreRepository.getUserById(userId); } catch (NoFirestoreDataException e) { if (e.getDataType() == FirestoreDataType.User) { // 处理预期的无User数据场景,比如给用户提示 showToast("未找到该用户信息"); } else { // 意外的异常类型,重新抛出,不做优雅处理 throw e; } }
方法2:给异常类添加匹配方法封装逻辑
可以在NoFirestoreDataException里新增一个方法来封装类型匹配的逻辑,让业务代码更简洁易读。
先修改异常类:
public class NoFirestoreDataException extends RuntimeException { private final FirestoreDataType dataType; // 构造方法、getter等省略 // 新增匹配方法 public boolean isExpectedType(FirestoreDataType expectedType) { return this.dataType == expectedType; } }
然后在业务代码中使用:
try { User targetUser = firestoreRepository.getUserById(userId); } catch (NoFirestoreDataException e) { if (e.isExpectedType(FirestoreDataType.User)) { handleUserNotFound(); } else { throw e; } }
方法3:利用Java 9+的异常过滤特性
如果你的项目使用Java 9及以上版本,可以用catch子句的过滤条件,直接在捕获阶段就只匹配预期的异常类型,代码会更优雅:
try { User targetUser = firestoreRepository.getUserById(userId); } catch (NoFirestoreDataException e) when (e.getDataType() == FirestoreDataType.User) { // 只有当dataType是User时才会进入这个块处理 handleUserNotFound(); } // 不匹配的异常会自动向上传播,不会被这个catch块处理
为什么这样可行?
这种方式既保持了单一异常类型的简洁性,又能精准控制哪些异常需要优雅处理——意外的dataType异常会直接向上抛出,不会被你的捕获逻辑处理,正好符合你“只处理预期匹配场景”的需求,还能在出现意外情况时快速暴露问题,方便调试排查。
内容的提问来源于stack exchange,提问作者Charlie Page
相关产品推荐
相关产品推荐

