Error Handling
Custom Exception
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.
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);
}
}
name ← Ada
12void main() {13 var name = 'Ada';14 try {values this stepAdanamecall ← requireName('Ada')
14try {15 requireName(name);16 print('ok:$name');values this steprequireName('Ada')callAdanamevalid ← true
8void requireName(String name) {9 if (name.isEmpty) throw ValidationError('name');10}values this steptruevalidfalsename.isEmptyprint('ok:$name');
15 requireName(name);16 print('ok:$name');17} catch (e) {outputok:Adavalues this stepAdaname
name ← (empty)
12void main() {13 var name = '';14 try {values this step(empty)namecall ← requireName('')
14try {15 requireName(name);16 print('ok:$name');values this steprequireName('')call(empty)namethrows ← ValidationError('name')
8void requireName(String name) {9 if (name.isEmpty) throw ValidationError('name');10}values this stepValidationError('name')throwstruename.isEmptyprint(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`.