我注意到在所有使用网络的示例(Retrofit、Ktor 等)中都创建了这样的密封类:
sealed interface ApiResponse<out T> {
data class Success<T> : ApiResponse<T>
data class Failure<T> : ApiResponse<T>
}
这种错误处理方法的优点是什么?毕竟,我们必须将
ApiResponse
通过应用程序的所有层传递给最终消费者。
或者为干净架构的每一层复制此类与类似的类。这反过来又导致需要映射数据并创建更多样板代码。
使用异常发送错误可以吗?在最终消费者中,我们可以使用
try/catch
或 Flow.catch
。有什么原因可以解释为什么这种方法比使用密封类更不可取(除了我可能忘记处理异常)?
这些库确实使用了异常。 特别是retrofit,它会在网络故障时抛出异常。 RetroFit 所基于的 OkHTTP 库也是如此。 所以是的,发送异常是可以的。 使用异常还是结果类是您在编写此类库时做出的可用性决定。
您可能想要使用其中之一的原因有几个,并且它涉及您认为失败和不失败的详细信息。 使用 API,点击 www.example.com/myEndpoint?search=id。 可以对其进行编程,以便如果 id 存在则返回 200,如果不存在则返回 404(基本上使用 HTTP 错误代码,因为它们的设计目的)。 或者可以对其进行编程,使其以任一方式返回 200,并且成功/失败位于响应正文中(可能是发生 http 错误的最常见方法)。 那么 404 是一个应该抛出异常的错误吗? 对于第一种情况可能不是,对于第二种情况可能是。 返回一个值并让您决定该值是否错误通常更容易。