[IO] - Use try/catch in lookupAddresses instead of Future error.

Applying patch from @aam for using try/catch in lookupAddresses instead
of Future error.

This will be cherry picked into the stable branch to ensure we
address the expedient issue in https://github.com/dart-lang/sdk/issues/53334

TEST=new test added.

Change-Id: Ia5375cbd118d8d6437cf6869383f173cab48aa3f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/323684
Commit-Queue: Siva Annamalai <asiva@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
This commit is contained in:
asiva 2023-09-06 18:39:14 +00:00 committed by Commit Queue
parent 194951a41f
commit f7ef52616a
2 changed files with 74 additions and 4 deletions

View file

@ -0,0 +1,68 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--verbose_debug
// Test checks to make sure we don't encounter any unhandled exceptions
// in the URL lookup code.
// (please see https://github.com/dart-lang/sdk/issues/53334 for more details).
import 'dart:developer';
import 'dart:io';
import 'package:expect/expect.dart';
import 'common/service_test_common.dart';
import 'common/test_helper.dart';
// AUTOGENERATED START
//
// Update these constants by running:
//
// dart runtime/observatory/tests/service/update_line_numbers.dart <test.dart>
//
const int LINE_0 = 46;
// AUTOGENERATED END
const String file = "break_on_unhandled_exception_test.dart";
Future<int> testFunction() async {
try {
var client = new HttpClient();
final urlstr = 'https://www.bbc.co.uk/';
final uri = Uri.parse(urlstr);
var response = await client.getUrl(uri);
Expect.equals(urlstr, response.uri.toString());
return 0;
} catch (e) {
print(e.toString());
return 1;
}
}
void testMain() async {
debugger();
final ret = await testFunction();
Expect.equals(ret, 0);
print("Done"); // LINE_0
}
final tests = <IsolateTest>[
hasStoppedAtBreakpoint,
// Add breakpoint
setBreakpointAtUriAndLine(file, LINE_0),
resumeIsolate,
hasStoppedAtBreakpoint,
stoppedAtLine(LINE_0),
resumeIsolate,
];
void main(args) => runIsolateTests(
args,
tests,
'break_on_unhandled_exception_test.dart',
pause_on_unhandled_exceptions: true,
testeeConcurrent: testMain,
);

View file

@ -627,8 +627,10 @@ base class _NativeSocket extends _NativeSocketNativeWrapper
// Only report an error if no address lookups were sucessful.
var anySuccess = false;
void lookupAddresses(InternetAddressType type, Completer<void> done) {
lookup(host, type: type).then((addresses) {
void lookupAddresses(
InternetAddressType type, Completer<void> done) async {
try {
final addresses = await lookup(host, type: type);
anySuccess = true;
if (done.isCompleted) {
// By the time lookup is done, [connectNext] might have
@ -637,14 +639,14 @@ base class _NativeSocket extends _NativeSocketNativeWrapper
}
controller.add(addresses);
done.complete();
}, onError: (e, st) {
} catch (e, st) {
if (done.isCompleted) {
// By the time lookup is done, [connectNext] might have
// been able to connect to one of the resolved addresses.
return;
}
done.completeError(e, st);
});
}
}
const concurrentLookupDelay = Duration(milliseconds: 10);