Skip to content

Commit 2335cc9

Browse files
committed
fix: ArgResults.operator[] should throw Exception not Error
ArgResults.operator[] and ArgResults.option() would throw ArgumentError instead of Exception when the user would fail to pass all expected arguments. Errors are only supposed to be thrown on programmer error so changed to throw ArgParserException instead. This is a breaking change!
1 parent f608a00 commit 2335cc9

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

pkgs/args/lib/src/arg_results.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:collection';
66

77
import 'arg_parser.dart';
8+
import 'arg_parser_exception.dart';
89

910
/// Creates a new [ArgResults].
1011
///
@@ -71,7 +72,7 @@ class ArgResults {
7172

7273
final option = _parser.options[name]!;
7374
if (option.mandatory && !_parsed.containsKey(name)) {
74-
throw ArgumentError('Option $name is mandatory.');
75+
throw ArgParserException('Option $name is mandatory.');
7576
}
7677

7778
return option.valueOrDefault(_parsed[name]);
@@ -103,7 +104,7 @@ class ArgResults {
103104
throw ArgumentError('"$name" is a multi-option.');
104105
}
105106
if (option.mandatory && !_parsed.containsKey(name)) {
106-
throw ArgumentError('Option $name is mandatory.');
107+
throw ArgParserException('Option $name is mandatory.');
107108
}
108109
return option.valueOrDefault(_parsed[name]) as String?;
109110
}

pkgs/args/test/command_runner_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:args/args.dart';
56
import 'package:args/command_runner.dart';
67
import 'package:test/test.dart';
78

@@ -736,7 +737,7 @@ Run "test help" to see global options.'''));
736737
runner.addCommand(subcommand);
737738
expect(
738739
() => runner.run([subcommand.name]),
739-
throwsA(isA<ArgumentError>().having((e) => e.message, 'message',
740+
throwsA(isA<ArgParserException>().having((e) => e.message, 'message',
740741
contains('Option mandatory-option is mandatory'))));
741742
expect(await runner.run([subcommand.name, '--mandatory-option', 'foo']),
742743
'foo');

pkgs/args/test/parse_test.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,10 @@ void main() {
595595
var parser = ArgParser();
596596
parser.addOption('username', mandatory: true);
597597
var results = parser.parse([]);
598-
expect(() => results['username'], throwsA(isA<ArgumentError>()));
598+
expect(
599+
() => results['username'],
600+
throwsA(isA<ArgParserException>().having((e) => e.message,
601+
'message', 'Option username is mandatory.')));
599602
});
600603

601604
test('throw if no mandatory args', () {
@@ -604,7 +607,10 @@ void main() {
604607
parser.addOption('username', mandatory: true);
605608
var results = parser.parse(['--test', 'test']);
606609
expect(results['test'], equals('test'));
607-
expect(() => results['username'], throwsA(isA<ArgumentError>()));
610+
expect(
611+
() => results['username'],
612+
throwsA(isA<ArgParserException>().having((e) => e.message,
613+
'message', 'Option username is mandatory.')));
608614
});
609615

610616
test('parse successfully', () {
@@ -620,8 +626,9 @@ void main() {
620626
parser.addOption('test', mandatory: true);
621627
var results = parser.parse(['-h']);
622628
expect(results['help'], true);
623-
expect(() => results['test'], throwsA(isA<ArgumentError>()));
624-
expect(() => results.option('test'), throwsA(isA<ArgumentError>()));
629+
expect(() => results['test'], throwsA(isA<ArgParserException>()));
630+
expect(
631+
() => results.option('test'), throwsA(isA<ArgParserException>()));
625632
});
626633
});
627634
});

0 commit comments

Comments
 (0)