Подтвердить что ты не робот

Javascript не обнаруживает ошибок при создании WebSocket

Мой сокет в настоящее время выдает net:: ERR_CONNECTION_REFUSED, потому что сервер не работает, что я хочу сделать в данный момент.

Проблема заключается в том, что следующий фрагмент кода не устраняет ошибку. В консоли я вижу исключение в строке 2 (с net:: ERR_CONNECTION_REFUSED), которое, я считаю, не должно происходить, как в заявлении try.

1  try {
2    ws = new WebSocket('ws://'+ host + ':' + port + '/');
3  }
4  catch (err) {
5    console.log('This never prints');
6  }
7  ws.onerror = function (error) {
8    console.log(error);
9  };

Итак, мой вопрос: почему он не пойман?

В конечном итоге я хочу, чтобы сообщение об ошибке отображалось в другом месте, но я не могу его уловить, а строка 8 выводит объект "событие", который не упоминает net:: ERR_CONNECTION_REFUSED, поэтому я не уверен, как чтобы получить сообщение об ошибке.

4b9b3361

Ответ 1

Ошибка времени подключения WebSocket вызывает отправленное событие, а не сброшенное значение. Это связано с тем, что операции throw должны быть синхронными. Чтобы обрабатывать все ошибки времени соединения в качестве ошибочных ошибок, конструктор WebSocket должен был бы полностью приостановить все действия script и взаимодействие с пользовательским интерфейсом до тех пор, пока не будет завершено все рукопожатие WebSocket. Вместо этого процесс соединения выполняется асинхронно, тем самым позволяя потоку браузера продолжать работать, пока соединение WebSocket инициализируется в фоновом режиме. Из-за асинхронного характера соединения WebSocket должен сообщать об ошибках через события error, так как синхронная операция new WebSocket уже завершена к тому моменту, когда задача асинхронного подключения обнаруживает ошибку.

Сообщение ERR_CONNECTION_REFUSED, которое вы видите, предназначено исключительно для разработчиков; он не доступен для script каким-либо образом. Он не имеет никакого представления в среде JavaScript. Это просто красноватое сообщение, которое появляется на консоли, чтобы сообщить вам, человеку, смотрящему в браузере, об ошибке.

Событие обработчика error - это правильное место для ответа на сбой, но недостаток script - доступная информация об ошибках времени соединения - по дизайну. Из спецификации WHATWG для API WebSocket:

Пользовательские агенты не должны передавать информацию о сбоях в сценарии таким образом, чтобы позволить script различать следующие ситуации:

  • Сервер, имя хоста которого не может быть разрешено.
  • Сервер, на который пакеты не могут быть успешно перенаправлены.
  • Сервер, который отказался от соединения на указанном порту.
  • Сервер, который не смог правильно выполнить рукопожатие TLS (например, сертификат сервера не может быть проверен).
  • Сервер, который не завершил начальное рукопожатие (например, потому что это не сервер WebSocket).
  • Сервер WebSocket, который отправил правильное начальное рукопожатие, но указанные параметры, которые заставили клиента отказаться от соединения (например, сервер указал подпротокол, который клиент не предлагал).
  • Сервер WebSocket, который внезапно закрыл соединение после успешного завершения открытия рукопожатия.

[...] Разрешение script отличать эти случаи позволило бы script исследовать локальную сеть пользователя при подготовке к атаке.

В браузере умышленно отсутствует какая-либо полезная информация, требуемая спецификацией. Авторы спецификаций обеспокоены тем, что доступ к этой информации может позволить злонамеренной веб-странице получать информацию о вашей сети, поэтому они требуют, чтобы браузеры сообщали о всех ошибках времени соединения неразличимым способом.

Ответ 2

Я пытался создать скрипку с ней и я могу видеть напечатанную строку.

host='localhost';
port=100;
try {

    ws = new WebSocket('ws://'+ host + ':' + port + '/');
  }
  catch (err) {
    console.log('This never prints');
  }
  ws.onerror = function (error) {
    console.log(error);
  };

https://jsfiddle.net/xzumgag0/