Классы исключений и ошибок

Последнее обновление: 09.04.2023

В стандартной библиотеке языка Dart есть два класса, которые являются основными для всех остальных типов ошибок и исключений. Во-первых, это класс Exception, который является базовым классом для всех остальных типов исключений. И во-вторых, это класс Error, который является базовым классом для для всех типов ошибок.

Итак, у нас есть два типа ситуаций - исключения и ошибки. В чем разница между ними? Исключения обычно представляют такие ситуации, которые нельзя обнаружить или спрогрогнозировать или проверить на уровне кода. Ошибки, наоборот, представляют ситуации, которые могут быть обнаружены на уровне программного кода.

В конструкции try..catch мы можем обрабатывать исключения и ошибки определенного типа. Для этого применяется оператор on:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
	 
		print(z);
	}
	on Error{
		 print("Обработка ошибки в блоке on");
	}
	print("Завершение программы"); 
}

После оператора on указывается тип исключения или ошибки, которые надо обработать. В данном случае выражение on Error говорит, что мы обрабатываем исключения типа Error. А поскольку это базовый тип для всех ошибок, то фактически мы обрабатываем все ошибки.

Подобным образом можно обрабатывать и исключения:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
	 
		print(z);
	}
	on Exception{
		 print("Обработка исключения в блоке on");
	}
	print("Завершение программы"); 
}

Но мы также можем конкретизировать тип ошибки или исключения:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
	 
		print(z);
	}
	on IntegerDivisionByZeroException{
		 print("Обработка исключения IntegerDivisionByZeroException");
	}
	print("Завершение программы");
}

В данном случае мы обрабатываем исключения только типа IntegerDivisionByZeroException. Если в блоке try вдруг возникнут исключения других типов, то они будут не обработаны.

Обработку конкретных типов исключений можно делать вместе с блоком catch:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
	 
		print(z);
	}
	on IntegerDivisionByZeroException{
		 print("Обработка исключения IntegerDivizionByZeroException");
	}
	catch(e){
		print("Возникло исключение: $e");
	}
	print("Завершение программы");
	 
}

В данном случае если возникнет исключение типа IntegerDivisionByZeroException, то его будет обрабатывать блок on, если исключение другого типа - то блок catch.

Стоит отметить, что IntegerDivisionByZeroException является одновременно и исключением и ошибкой, поскольку реализует интерфейс типом Exception и UnsupportedError (тип ошибки, производный от Error)

Также мы можем объединить блоки on и catch:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
	 
		print(z);
	}
	on IntegerDivisionByZeroException catch(e, s){
		 print("Обработка исключения $e");
		 print("Стек $s");
	}
	print("Завершение программы"); 
}

Встроенные типы исключений

На данный момент в языке Dart есть много типов исключений:

  • DeferredLoadException

  • FormatException

  • IntegerDivisionByZeroException (помечен как устаревший)

  • IOException

  • FileSystemException

  • PathNotFoundException

  • HttpException

  • RedirectException

  • ProcessException

  • SignalException

  • SocketException

  • StdinException

  • StdoutException

  • TlsException

  • CertificateException

  • HandshakeException

  • WebSocketException

  • IsolateSpawnException

  • TimeoutException

  • NullRejectionException

  • OSError

Также есть много типов ошибок для различных ситуаций:

  • ArgumentError

  • IndexError

  • RangeError

  • AssertionError

  • AsyncError

  • ConcurrentModificationError

  • JsonUnsupportedObjectError

  • JsonCyclicError

  • NoSuchMethodError

  • OutOfMemoryError

  • RemoteError

  • StackOverflowError

  • StateError

  • TypeError

  • UnimplementedError

  • UnsupportedError

Для каждого типа исключения или ошибки, который мы хотим обработать, мы можем добавить свой блок on:

void main (){
     
	 try{
		int x = 9;
		int y = 0;
		int z = x ~/ y;
		print(z);
	}
	on IntegerDivisionByZeroException{
		 print("Обработка исключения IntegerDivisionByZeroException");
	}
	on FormatException{
		 print("Обработка исключения FormatException");
	}
	print("Завершение программы");
	 
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850