我有以下 Flutter & Dart 代码函数,它向服务器发送请求:
Future<void> autoAuth(BuildContext ctx) async {
final url = Uri.parse('${this._baseURL.toString()}/auto-auth');
try {
final deviceStorage = await SharedPreferences.getInstance();
if (deviceStorage.getString('refreshToken') == null) {
return this._setUser(null);
}
final response = await http.post(url, headers: {
'Authorization': 'Bearer ${deviceStorage.getString('refreshToken')!}',
}).timeout(const Duration(seconds: 3));
final Map<String, dynamic> responseBody = json.decode(response.body);
if (responseBody['success']) {
this._refreshAccessToken(ctx, deviceStorage);
return this._setUser(new User(
id: responseBody['data']['id'],
isSubscribed: responseBody['data']['isSubscribed'],
playlistId: responseBody['data']['playlistId'],
));
}
this._setUser(null);
} on SocketException {
this._setUser(null);
throw Error();
} on TimeoutException {
this._setUser(null);
throw Error();
} catch (_) {
this._setUser(null);
}
}
请注意,该 url 是故意错误的,因此请求将超时。
但是,为此,我在未来的请求中编码:.timeout(...)
。因此,基本上,3 秒后它应该被 on TimeoutException
异常捕获捕获。
确实如此。然而,大约 1 分钟后(可能是 dart 中 http 请求的默认超时),我收到一个未捕获的异常,因为请求已超时。我哪里错了?
最佳答案
这是因为你的使用方式不对。您使用的 .timeout
代码是任何 future 的通用超时。因此,您捕获了 future 超时的错误,但没有捕获由 http 请求超时生成的错误。
要正确使用它,首先添加以下导入:import 'package:http/io_client.dart' as http;
然后将代码更改为:
final ioClient = HttpClient();
ioClient.connectionTimeout = const Duration(seconds: 3);
final client = http.IOClient(ioClient);
final response = await client.post(url, headers: {
'Authorization': 'Bearer ${deviceStorage.getString('refreshToken')!}',
});
关于flutter - 为什么发送以下请求会出现未捕获的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69667673/