diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart
index 840eef6..830624b 100644
--- a/bin/dartdoc.dart
+++ b/bin/dartdoc.dart
@@ -57,12 +57,6 @@
     // TODO(jcollins-g): use exit once dart-lang/sdk#31747 is fixed.
     exitCode = 64;
     return;
-  } on DartdocOptionError catch (e) {
-    stderr.writeln(' fatal error: ${e.message}');
-    stderr.writeln('');
-    _printUsage(optionSet.argParser);
-    exitCode = 64;
-    return;
   }
   if (optionSet['help'].valueAt(Directory.current)) {
     _printHelp(optionSet.argParser);
@@ -75,8 +69,17 @@
     return;
   }
 
-  DartdocProgramOptionContext config =
-      new DartdocProgramOptionContext(optionSet, null);
+  DartdocProgramOptionContext config;
+  try {
+    config = new DartdocProgramOptionContext(optionSet, null);
+  } on DartdocOptionError catch (e) {
+    stderr.writeln(' fatal error: ${e.message}');
+    stderr.writeln('');
+    await stderr.flush();
+    _printUsage(optionSet.argParser);
+    exitCode = 64;
+    return;
+  }
   startLogging(config);
 
   Directory outputDir = new Directory(config.output);
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index ab02d48..30d6fef 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -131,6 +131,43 @@
         await Future.wait(CoverageSubprocessLauncher.coverageResults);
       });
 
+      test('invalid parameters return non-zero and print a fatal-error',
+          () async {
+        List outputLines = [];
+        await expectLater(
+            () => subprocessLauncher.runStreamed(
+                Platform.resolvedExecutable,
+                [
+                  dartdocPath,
+                  '--nonexisting',
+                ],
+                perLine: outputLines.add),
+            throwsA(const TypeMatcher<ProcessException>()));
+        expect(
+            outputLines.firstWhere((l) => l.startsWith(' fatal')),
+            equals(
+                ' fatal error: Could not find an option named "nonexisting".'));
+      });
+
+      test('missing a required file path prints a fatal-error', () async {
+        List outputLines = [];
+        String impossiblePath = pathLib.join(dartdocPath, 'impossible');
+        await expectLater(
+            () => subprocessLauncher.runStreamed(
+                Platform.resolvedExecutable,
+                [
+                  dartdocPath,
+                  '--input',
+                  impossiblePath,
+                ],
+                perLine: outputLines.add),
+            throwsA(const TypeMatcher<ProcessException>()));
+        expect(
+            outputLines.firstWhere((l) => l.startsWith(' fatal')),
+            startsWith(
+                ' fatal error: Argument --input, set to ${impossiblePath}, resolves to missing path: '));
+      });
+
       test('errors cause non-zero exit when warnings are off', () async {
         expect(
             () => subprocessLauncher.runStreamed(Platform.resolvedExecutable, [
diff --git a/test/src/utils.dart b/test/src/utils.dart
index 3cf9b4a..fde3819 100644
--- a/test/src/utils.dart
+++ b/test/src/utils.dart
@@ -182,10 +182,11 @@
 
     Completer<String> portAsString = new Completer();
     void parsePortAsString(String line) {
-      if (perLine != null) perLine(line);
-      if (!portAsString.isCompleted) {
+      if (!portAsString.isCompleted && coverageEnabled) {
         Match m = observatoryPortRegexp.matchAsPrefix(line);
         if (m?.group(1) != null) portAsString.complete(m.group(1));
+      } else {
+        if (perLine != null) perLine(line);
       }
     }
 
