Не удается поймать SocketException
Я пробую Дарт, и я боролся с этим довольно долго. Вызов:
runServer() {
HttpServer.bind(InternetAddress.ANY_IP_V4, 8080)
.then((server) {
server.listen((HttpRequest request) {
request.response.write('Hello, World!');
request.response.close();
});
});
}
Когда-то работает как шарм. А потом, пытаясь
try {
runServer();
} on Error catch (e) {
print("error");
} on Exception catch(f) {
print("exception");
}
Теперь я ожидаю, что если бы я использовал этот try-catch и начал прослушивать один и тот же порт более одного раза, потому что я ловлю ВСЕ исключения и ВСЕ ошибки, программа не вылетит. Однако после двухкратного выполнения кода вместо ввода какого-либо предложения try/catch я получаю:
Uncaut Error: SocketException: не удалось создать сокет сервера (ошибка ОС: обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт).
Хотя я понимаю, что это за ошибка, я не понимаю, почему она просто не вводит предложение catch Error/Exception?
1 ответ
Асинхронные ошибки не могут быть обнаружены с помощью try
/catch
( https://www.dartlang.org/docs/tutorials/futures/) по крайней мере, если вы не используете async
/await
( https://www.dartlang.org/articles/await-async/)
Смотрите также https://github.com/dart-lang/sdk/issues/24278
Вы можете использовать
done
будущее наWebSocket
объект, чтобы получить эту ошибку, например:
import 'dart:async';
import 'dart:io';
main() async {
// Connect to a web socket.
WebSocket socket = await WebSocket.connect('ws://echo.websocket.org');
// Setup listening.
socket.listen((message) {
print('message: $message');
}, onError: (error) {
print('error: $error');
}, onDone: () {
print('socket closed.');
}, cancelOnError: true);
// Add message, and then an error.
socket.add('echo!');
socket.addError(new Exception('error!'));
// Wait for the socket to close.
try {
await socket.done;
print('WebSocket donw');
} catch (error) {
print('WebScoket done with error $error');
}
}
Вы можете указать SocketException
try {
//network request
} on SocketException catch (_) {
//handle socket exception here
} catch (_) {
//handle other error
}