Dart 为什么可以';我不能赶上这次吗

Dart 为什么可以';我不能赶上这次吗,dart,websocket,dart-html,Dart,Websocket,Dart Html,我目前正在为我想要控制连接超时值的Web构建Stomp WebSocket连接。这是我的连接方法: Future<WebSocketChannel> connect(StompConfig config) { final completer = Completer<HtmlWebSocketChannel>(); final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;

我目前正在为我想要控制连接超时值的Web构建Stomp WebSocket连接。这是我的连接方法:

Future<WebSocketChannel> connect(StompConfig config) {
  final completer = Completer<HtmlWebSocketChannel>();
  final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
  var onOpenEvent = webSocket.onOpen.first;
  if (config.connectionTimeout.inMilliseconds > 0) {
    onOpenEvent = onOpenEvent.timeout(config.connectionTimeout);
  }
  onOpenEvent.then((value) {
    completer.complete(HtmlWebSocketChannel(webSocket));
  });
  webSocket.onError.first.then((err) {
    completer.completeError(WebSocketChannelException.from(err));
  });

  return completer.future;
}
遗憾的是,我似乎无法捕获由
onOpenEvent.timeout(..)
引发的
TimeoutException
。相反,它只打印以下内容(看似未捕获的异常):

我做错了什么?我以前的代码看起来是这样的,适用于
TimeoutException
,但遗憾的是,它不适用于WebSocket引发的任何其他异常:

Future<WebSocketChannel> connect(StompConfig config) async {
  final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
  var onOpenEvent = webSocket.onOpen.first;
  if (config.connectionTimeout.inMilliseconds > 0) {
    onOpenEvent = onOpenEvent.timeout(config.connectionTimeout);
  }
  await onOpenEvent;
  return HtmlWebSocketChannel(webSocket);
}
Future connect(StompConfig)异步{
最终webSocket=webSocket(config.url)…binaryType=binaryType.list.value;
var onOpenEvent=webSocket.onOpen.first;
如果(config.connectionTimeout.inmillizes>0){
onOpenEvent=onOpenEvent.timeout(config.connectionTimeout);
}
等待事件的发生;
返回HtmlWebSocketChannel(webSocket);
}
谢谢你的建议

你可以捕获异常,但你不能。 声明

onOpenEvent.then((值){
completer.complete(HtmlWebSocketChannel(webSocket));
});
侦听打开事件的未来,并创建一个新的未来。 当onOpenEvent在超时异常下完成时,此
调用将获得错误,并且由于它不处理异常,因此它返回的未来也将在相同异常下完成

因为上面的语句丢弃了未来,所以没有人接触过未来,因此未来的结果是一个未处理的错误

您以前的代码工作的原因是
await onOpenEvent
将(重新)抛出该错误,并使其成为整个
connect
调用的结果

新代码无法使该错误到达
connect
函数调用,
onOpenEvent。然后(…)
connect
返回后,未来可能会完成

您可以尝试向
调用添加错误处理程序,然后
调用:

onOpenEvent.then((值){
completer.complete(HtmlWebSocketChannel(webSocket));
},onError:(错误,StackTrace StackTrace){
如果(!completer.isCompleted)completer.completeError(错误,堆栈跟踪);
});
webSocket.onError.first.then((错误){
如果(!completer.isCompleted){
completer.completeError(WebSocketChannelException.from(err));
}
});

谢谢!这是有道理的。相反,我在
完成器的
未来
上设置了一个超时,并返回该未来。
Error: TimeoutException after 0:00:05.000000: Future not completed
    at Object.createErrorWithStack (http://localhost:59275/dart_sdk.js:5044:12)
    at Object._rethrow (http://localhost:59275/dart_sdk.js:37476:16)
    at async._AsyncCallbackEntry.new.callback (http://localhost:59275/dart_sdk.js:37472:13)
    at Object._microtaskLoop (http://localhost:59275/dart_sdk.js:37332:13)
    at _startMicrotaskLoop (http://localhost:59275/dart_sdk.js:37338:13)
    at http://localhost:59275/dart_sdk.js:33109:9
Future<WebSocketChannel> connect(StompConfig config) async {
  final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
  var onOpenEvent = webSocket.onOpen.first;
  if (config.connectionTimeout.inMilliseconds > 0) {
    onOpenEvent = onOpenEvent.timeout(config.connectionTimeout);
  }
  await onOpenEvent;
  return HtmlWebSocketChannel(webSocket);
}