我正在使用 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.
});
如
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() 不仅允许您处理您知道可能发生的错误,还可以防止错误意外泄漏到您的函数中。
在我的例子中,调用是使用 Microsoft Internet Information Services 作为后端的 https 地址,在 IIS 网站的 SSL 设置中,我错误地设置了“客户端证书:接受”而不是“客户端证书:忽略”,设置“忽略” “解决了问题。
只需转到 C:\Users{user}\AppData\Local\Pub 并删除缓存文件夹。
来自可用的 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.
}