Не удается поймать 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
}
Другие вопросы по тегам