Ik heb deze code geschreven om te testen hoe aangepaste uitzonderingen werken in de dart.
Ik krijg niet de gewenste output, kan iemand mij uitleggen hoe ik hiermee om moet gaan??
void main()
{
try
{
throwException();
}
on customException
{
print("custom exception is been obtained");
}
}
throwException()
{
throw new customException('This is my first custom exception');
}
Antwoord 1, autoriteit 100%
Je kunt het Uitzonderingsgedeelte van Een rondleiding door de Dart-taal.
De volgende code werkt zoals verwacht (custom exception has been obtained
wordt weergegeven in console):
class CustomException implements Exception {
String cause;
CustomException(this.cause);
}
void main() {
try {
throwException();
} on CustomException {
print("custom exception has been obtained");
}
}
throwException() {
throw new CustomException('This is my first custom exception');
}
Antwoord 2, autoriteit 36%
Je hebt geen Exception-klasse nodig als het type Exception je niet interesseert. Activeer eenvoudig een uitzondering zoals deze:
throw ("This is my first general exception");
Antwoord 3, autoriteit 13%
Dartcode kan uitzonderingen veroorzaken en vangen. In tegenstelling tot Java zijn alle uitzonderingen van Dart ongecontroleerde uitzonderingen. Methoden geven niet aan welke uitzonderingen ze kunnen veroorzaken, en u hoeft geen uitzonderingen op te vangen.
Dart biedt Exception
en Error
types, maar je mag elk niet-null object gooien:
throw Exception('Something bad happened.');
throw 'Waaaaaaah!';
Gebruik de trefwoorden try
, on
en catch
bij het afhandelen van uitzonderingen:
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
Het trefwoord try
werkt net als in de meeste andere talen. Gebruik het trefwoord on
om te filteren op specifieke uitzonderingen op type en het trefwoord catch
om een verwijzing naar het uitzonderingsobject te krijgen.
Als u de uitzondering niet volledig kunt verwerken, gebruikt u het trefwoord rethrow
om de uitzondering te verspreiden:
try {
breedMoreLlamas();
} catch (e) {
print('I was just trying to breed llamas!.');
rethrow;
}
Om code uit te voeren, ongeacht of er een uitzondering wordt gegenereerd of niet, gebruik finally
:
try {
breedMoreLlamas();
} catch (e) {
// ... handle exception ...
} finally {
// Always clean up, even if an exception is thrown.
cleanLlamaStalls();
}
Codevoorbeeld
Implementeer tryFunction()
hieronder. Het moet een onbetrouwbare methode uitvoeren en dan het volgende doen:
- Als
untrustworthy()
eenExceptionWithMessage
genereert, bel danlogger.logException
met het uitzonderingstype en bericht (probeeron
encatch
). - Als
untrustworthy()
een uitzondering genereert, roept ulogger.logException
aan met het uitzonderingstype (probeer hiervooron
te gebruiken). - Als
untrustworthy()
een ander object genereert, vang de uitzondering dan niet. - Nadat alles is opgevangen en afgehandeld, belt u
logger.doneLogging
(probeerfinally
te gebruiken).
.
typedef VoidFunction = void Function();
class ExceptionWithMessage {
final String message;
const ExceptionWithMessage(this.message);
}
abstract class Logger {
void logException(Type t, [String msg]);
void doneLogging();
}
void tryFunction(VoidFunction untrustworthy, Logger logger) {
try {
untrustworthy();
} on ExceptionWithMessage catch (e) {
logger.logException(e.runtimeType, e.message);
} on Exception {
logger.logException(Exception);
} finally {
logger.doneLogging();
Antwoord 4
U kunt ook een abstracte uitzondering maken.
Inspiratie ontleend aan TimeoutException
van async
-pakket (lees de code op Dart APIen Dart SDK).
abstract class IMoviesRepoException implements Exception {
const IMoviesRepoException([this.message]);
final String? message;
@override
String toString() {
String result = 'IMoviesRepoExceptionl';
if (message is String) return '$result: $message';
return result;
}
}
class TmdbMoviesRepoException extends IMoviesRepoException {
const TmdbMoviesRepoException([String? message]) : super(message);
}