A small exception class can carry domain context while still implementing Dart's Exception contract.

Program

Play the program to validate a name, then select an empty name to throw the custom exception.

name
custom_exception.dart
Replay: real traced execution (multi-file project)
class ValidationError implements Exception {
  final String field;
  ValidationError(this.field);
  @override
  String toString() => 'ValidationError:$field';
}

void requireName(String name) {
  if (name.isEmpty) throw ValidationError('name');
}

void main() {
  var name = 'Ada';
  try {
    requireName(name);
    print('ok:$name');
  } catch (e) {
    print(e);
  }
}
class ValidationError implements Exception {
  final String field;
  ValidationError(this.field);
  @override
  String toString() => 'ValidationError:$field';
}

void requireName(String name) {
  if (name.isEmpty) throw ValidationError('name');
}

void main() {
  var name = '';
  try {
    requireName(name);
    print('ok:$name');
  } catch (e) {
    print(e);
  }
}
  1. name ← Ada

    12void main() {13  var name = 'Ada';14  try {
    values this stepAdaname
  2. call ← requireName('Ada')

    14try {15  requireName(name);16  print('ok:$name');
    values this steprequireName('Ada')callAdaname
  3. valid ← true

    8void requireName(String name) {9  if (name.isEmpty) throw ValidationError('name');10}
    values this steptruevalidfalsename.isEmpty
  4. print('ok:$name');

    15  requireName(name);16  print('ok:$name');17} catch (e) {
    outputok:Ada
    values this stepAdaname
  1. name ← (empty)

    12void main() {13  var name = '';14  try {
    values this step(empty)name
  2. call ← requireName('')

    14try {15  requireName(name);16  print('ok:$name');
    values this steprequireName('')call(empty)name
  3. throws ← ValidationError('name')

    8void requireName(String name) {9  if (name.isEmpty) throw ValidationError('name');10}
    values this stepValidationError('name')throwstruename.isEmpty
  4. print(e);

    17} catch (e) {18  print(e);19}
    outputValidationError:name
implements Exception The class can be thrown and caught as an exception.
context field `field` records which validation rule failed.
toString The display text is controlled by overriding `toString`.