Programowanie w rzutkach - wyjątki
Wyjątek (lub wyjątkowe zdarzenie) to problem, który pojawia się podczas wykonywania programu. Gdy wystąpi wyjątek, normalny przepływ programu zostaje zakłócony, a program / aplikacja kończy się nieprawidłowo.
Wbudowane wyjątki Dart obejmują -
Sr.No | Wyjątki i opis |
---|---|
1 | DeferredLoadException Zgłaszane, gdy odroczona biblioteka nie ładuje się. |
2 | FormatException Wyjątek zgłoszony, gdy ciąg lub inne dane nie mają oczekiwanego formatu i nie można ich przeanalizować ani przetworzyć. |
3 | IntegerDivisionByZeroException Wyrzucane, gdy liczba jest podzielona przez zero. |
4 | IOException Klasa bazowa dla wszystkich wyjątków związanych z wyjściem Inupt. |
5 | IsolateSpawnException Zgłaszane, gdy nie można utworzyć izolatu. |
6 | Timeout Zgłaszane, gdy nastąpi zaplanowany limit czasu podczas oczekiwania na wynik asynchroniczny. |
Każdy wyjątek w Dart jest podtypem wcześniej zdefiniowanej klasy Exception. Wyjątki muszą być obsługiwane, aby zapobiec nagłemu zamknięciu aplikacji.
Bloki try / on / catch
Plik tryblok osadza kod, który może spowodować wyjątek. Blok włączania jest używany, gdy należy określić typ wyjątku. Plikcatch blok jest używany, gdy program obsługi potrzebuje obiektu wyjątku.
Plik try po bloku musi następować dokładnie jeden on / catch blok lub jeden finallyblok (lub jeden z obu). Gdy wyjątek wystąpi w bloku try, formant jest przenoszony docatch.
Plik syntax do obsługi wyjątku podano poniżej -
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
Oto kilka punktów, o których należy pamiętać -
Fragment kodu może mieć więcej niż jeden blok on / catch do obsługi wielu wyjątków.
Blok on i blok catch wzajemnie się wykluczają, tj. Blok try może być powiązany zarówno z blokiem on, jak i blokiem catch.
Poniższy kod ilustruje obsługę wyjątków w Dart -
Przykład: Korzystanie z bloku ON
Poniższy program dzieli dwie liczby reprezentowane przez zmienne x i yodpowiednio. Kod zgłasza wyjątek, ponieważ próbuje podzielić przez zero. Plikon block zawiera kod do obsługi tego wyjątku.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
Powinien dać następujący wynik output -
Cannot divide by zero
Przykład: użycie bloku catch
W poniższym przykładzie użyliśmy tego samego kodu, co powyżej. Jedyną różnicą jest to, żecatch block(zamiast bloku ON) tutaj zawiera kod do obsługi wyjątku. Parametrcatch zawiera obiekt wyjątku zgłoszony w czasie wykonywania.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
Powinien dać następujący wynik output -
IntegerDivisionByZeroException
Przykład: na… haczyku
Poniższy przykład pokazuje, jak używać on...catch blok.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
Powinien dać następujący wynik output -
IntegerDivisionByZeroException
Ostatni blok
Plik finallyblok zawiera kod, który powinien zostać wykonany niezależnie od wystąpienia wyjątku. Opcjonalnyfinally blok jest wykonywany bezwarunkowo po try/on/catch.
Składnia używania finally blok jest następujący -
try {
// code that might throw an exception
}
on Exception1 {
// exception handling code
}
catch Exception2 {
// exception handling
}
finally {
// code that should always execute; irrespective of the exception
}
Poniższy przykład ilustruje użycie finally blok.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
finally {
print('Finally block executed');
}
}
Powinien dać następujący wynik output -
Cannot divide by zero
Finally block executed
Zgłaszanie wyjątku
Plik throwsłowo kluczowe służy do jawnego zgłaszania wyjątku. Należy obsłużyć podniesiony wyjątek, aby zapobiec nagłemu zamknięciu programu.
Plik syntax jawne zgłaszanie wyjątku to -
throw new Exception_name()
Przykład
Poniższy przykład pokazuje, jak używać throw słowo kluczowe, aby zgłosić wyjątek -
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
Powinien dać następujący wynik output -
Age cannot be negative
Wyjątki niestandardowe
Jak określono powyżej, każdy typ wyjątku w Dart jest podtypem klasy wbudowanej Exception. Dart umożliwia tworzenie niestandardowych wyjątków poprzez rozszerzenie istniejących. Składnia definiowania niestandardowego wyjątku jest następująca:
Składnia: definiowanie wyjątku
class Custom_exception_Name implements Exception {
// can contain constructors, variables and methods
}
Wyjątki niestandardowe powinny być zgłaszane jawnie i to samo powinno być obsługiwane w kodzie.
Przykład
Poniższy przykład pokazuje, jak zdefiniować i obsługiwać niestandardowy wyjątek.
class AmtException implements Exception {
String errMsg() => 'Amount should be greater than zero';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e.errMsg());
}
finally {
print('Ending requested operation.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException();
}
}
W powyższym kodzie definiujemy wyjątek niestandardowy, AmtException. Kod zgłasza wyjątek, jeśli przekazana kwota nie mieści się w zakresie objętym wyjątkiem. Plikmain funkcja zawiera wywołanie funkcji w try...catch blok.
Kod powinien dawać następujące efekty output -
Amount should be greater than zero
Ending requested operation....