3

我正在浏览Dart 服务器文档。我看到我可以await for像这样的 HttpRequest :

import 'dart:io';

Future main() async {
  var server = await HttpServer.bind(
    InternetAddress.loopbackIPv4,
    4040,
  );
  print('Listening on localhost:${server.port}');

  await for (HttpRequest request in server) {
    request.response.write('Hello, world!');
    await request.response.close();
  }
}

那是因为 HttpServer 实现了 Stream。但是由于流可以返回值或错误,我应该捕获这样的异常,对吧:

try {
  await for (HttpRequest request in server) {
    request.response.write('Hello, world!');
    await request.response.close();
  }
} catch (e) {
  // ???
}

但我不确定可以捕获什么样的异常。异常是来自请求(并保证 400 级响应)还是来自服务器(并保证 500 级响应)?或两者?

4

1 回答 1

1

错误状态代码

在异常情况下,将设置BAD_REQUEST状态代码:

    } catch (e) {
      // Try to send BAD_REQUEST response.
      request.response.statusCode = HttpStatus.badRequest;

(见来源

那将是400(见badRequest)。

流错误

在同一个catchblock中,异常将是rethrown,这意味着您仍然会收到流中的所有错误。这发生在 中processRequest,它处理 中的所有请求bind
并且您在流中收到错误,因为它们被转发到bind.

错误种类

我只能找到一个显式异常类型:

    if (disposition == null) {
      throw const HttpException(
          "Mime Multipart doesn't contain a Content-Disposition header value");
    }
    if (encoding != null &&
        !_transparentEncodings.contains(encoding.value.toLowerCase())) {
      // TODO(ajohnsen): Support BASE64, etc.
      throw HttpException('Unsupported contentTransferEncoding: '
          '${encoding.value}');
    }

(见来源

这些都是HttpExceptions

于 2020-12-09T01:55:11.370 回答