Een aangepaste uitzondering maken en deze in dart afhandelen

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 obtainedwordt 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 Exceptionen Errortypes, maar je mag elk niet-null object gooien:

throw Exception('Something bad happened.');
throw 'Waaaaaaah!';

Gebruik de trefwoorden try, onen catchbij 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 trywerkt net als in de meeste andere talen. Gebruik het trefwoord onom te filteren op specifieke uitzonderingen op type en het trefwoord catchom een ​​verwijzing naar het uitzonderingsobject te krijgen.

Als u de uitzondering niet volledig kunt verwerken, gebruikt u het trefwoord rethrowom 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()een ExceptionWithMessagegenereert, bel dan logger.logExceptionmet het uitzonderingstype en bericht (probeer onen catch).
  • Als untrustworthy()een uitzondering genereert, roept u logger.logExceptionaan met het uitzonderingstype (probeer hiervoor onte gebruiken).
  • Als untrustworthy()een ander object genereert, vang de uitzondering dan niet.
  • Nadat alles is opgevangen en afgehandeld, belt u logger.doneLogging(probeer finallyte 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 TimeoutExceptionvan 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);
}

Other episodes