【问题标题】:Refactor catch statements重构 catch 语句
【发布时间】:2021-07-28 09:23:50
【问题描述】:

我们的代码中有许多 try-catch 块来处理 api 调用的异常。由于大多数 catch 块是相同的,我们想要重构它们并且只重构它们(因为 try 块应该留在它们所在的位置)。这在 Flutter 中怎么可能实现?

示例代码:

try {
  _userData = apiService.call("user_data");
} on ResourceNotFoundException {
  handleResourceNotFoundException();
} on NetworkException {
  handleNetworkException();
}

【问题讨论】:

    标签: flutter exception try-catch


    【解决方案1】:

    您应该为 API 调用添加一些抽象,这意味着您应该添加一个函数,该函数将您尝试调用的 API 调用作为参数,并用 try-catch 块包围它并在那里处理所有异常。

    通过这种方式,您将 API 调用逻辑与处理异常分开。

    【讨论】:

    • 如果你仔细观察,你已经看到了这个确切的抽象。在我们的apiService 中,我们有一个 dio 客户端的抽象版本,它捕获所有异常并重新抛出我们自己的异常类型。现在我们将我们自己的异常传播到我们想要正确处理它们的视图模型中。这是放置这个问题的地方,它仍然是开放的。
    • 好的,现在我想我明白你想要达到什么目的了。你用什么来摆脱代码中的 catch 块,对吗?
    • 好吧,假设我想在多个场合重用常见的 catch 块。
    • 您可以尝试创建一个基类异常并让所有其他派生异常继承自。这样,您将只捕获基本异常,而无需捕获每个 API 的每种类型的异常。
    • 我们已经有了这个。但问题在于使用自己的默认处理程序处理每种具体的异常类型。
    【解决方案2】:

    我找到的最佳解决方案是使用一般的catch,将所有内容放入handleException 函数中,然后再次抛出异常。

    try {
      _userData = apiService.call("user_data");
    } on catch (e) {
      handleException(e);
    }
    
    
    void handleException(e) {
       try {
          throw e;
       } on ResourceNotFoundException {
          handleResourceNotFoundException();
       } on NetworkException {
          handleNetworkException();
       }
     }
    

    这样可以重用异常处理逻辑并扩展它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2017-11-08
      • 2017-09-15
      相关资源
      最近更新 更多