text: Title: uncontrollable chromium process caused by 'http.client.BadStatusLine: GET /json/version HTTP/1.1' exception
  Body: ```python
  browser = await launch(args)
  ```
  Code above may cause  'http.client.BadStatusLine: GET /json/version HTTP/1.1' exception, this exception raised by urllib.urlopen().
  In pyppeteer, urlopen used in `launcher.py`, line 222, code just like this
  ```python
  def get_ws_endpoint(url) -> str:
      url = url + '/json/version'
      timeout = time.time() + 30
      while (True):
          if time.time() > timeout:
              raise BrowserError('Browser closed unexpectedly:\n')
          try:
              with urlopen(url) as f:
                  data = json.loads(f.read().decode())
              break
          except URLError as e:
              continue
          time.sleep(0.1)
      return data['webSocketDebuggerUrl']
  ```
  the exception belong to http.client.HTTPException, not URLError. so, the `try ... except` can not catch the exception.
  In 'launch' method, browser can not be returned successfully.
  ```python
  connectionDelay = self.slowMo
  _self.browserWSEndpoint = get_ws_endpoint(self.url)_   # when this method raise exceptions, the following code is unreachable
  logger.info(f'Browser listening on: {self.browserWSEndpoint}')
  self.connection = Connection(self.browserWSEndpoint, self._loop, connectionDelay, )
  browser = await Browser.create(self.connection, [], self.ignoreHTTPSErrors, self.defaultViewport, self.proc,
                                         self.killChrome)
  await self.ensureInitialPage(browser)
  return browser
  ```
  but, the chromium process is launched before. so, I just can't control this process when 'http.client.BadStatusLine: GET /json/version HTTP/1.1' exception occured.
  ```python
  self.proc = subprocess.Popen(  # type: ignore
              self.cmd, **options, )  # launcher.py line 146
  ```
  In my opinion, the browser process should launch after called `Connection` method，this way obey the 'proximity rule' also.