Flutter- dart http 库 ClientException

问题描述 投票:0回答:4

我正在使用 HTTP dart package 在 flutter 中执行类似的发布请求,但有时当网络失败时,会从 IOClient 类抛出 ClientException ,但我在 catch 块中没有得到任何内容,并且应用程序崩溃。

http.post(url, headers: headers, body: body).then((response) {
  //response parsing
}).catchError((error) {
 //ClientException is never catched in this block.
});
android dart flutter
4个回答
2
投票

package:http/src/io_client.dart
中所述:

任何内部 HTTP 错误都应包装为 [ClientException]。

正如文档中提到的,这是一个明显的案例:

潜在问题:意外混合同步和异步错误

要解决此问题,您需要将代码包装在 Future.sync() 中。

Future.sync() 使您的代码能够抵御未捕获的异常。如果您的函数中包含大量代码,那么您很可能在没有意识到的情况下做了一些危险的事情:

return new Future.sync(() {
  http.post(url, headers: headers, body: body).then((response) {});
});

Future.sync() 不仅允许您处理您知道可能发生的错误,还可以防止错误意外泄漏到您的函数中。


0
投票

在我的例子中,调用是使用 Microsoft Internet Information Services 作为后端的 https 地址,在 IIS 网站的 SSL 设置中,我错误地设置了“客户端证书:接受”而不是“客户端证书:忽略”,设置“忽略” “解决了问题。


0
投票

只需转到 C:\Users{user}\AppData\Local\Pub 并删除缓存文件夹。


0
投票

来自可用的 IOClient 类文档 here 这是

ClientException
类如何用于处理来自 pkg/http 客户端的异常;

final client = http.Client();
late String data;

try {
  data = await client.post(url, headers: headers, body: body);
} on SocketException catch (e) {
  // Exception is transport-related, check `e.osError` for more details.
} on http.ClientException catch (e) {
  // Exception is HTTP-related (e.g. the server returned a 404 status code).
  // If the handler for `SocketException` were removed then all exceptions
  // would be caught by this handler.
}
© www.soinside.com 2019 - 2024. All rights reserved.