Исключение – это проблема, которая может возникнуть во время выполнения программы. Это ответ D на исключительные ситуации, которые возникают во время выполнения программы, например, при попытке деления на ноль.
Исключения предоставляют способ передачи контроля из одной части программы в другую. В D обработка исключений производится с помощью трех ключевых слов: try, catch и throw.
throw − При возникновении проблемы программа бросает исключение. Это делается с использованием ключевого слова throw.
catch − Программа получает исключение через обработчик исключений в том месте в программе, где вы хотите справиться с этой проблемой. Ключевое слово catch указывает на вылавливание исключений.
try − Блок try определяет блок кода, в котором могут активироваться определённые исключения. За ним следует один или несколько блоков catch.
Если предполагается, что блок может вызвать исключение, его ловят с использованием комбинации ключевых слов try и catch. Блок try/catch помещается вокруг кода, который может сгенерировать исключение. Код внутри блока try/catch называется защищённым кодом, а синтаксис использования try/catch выглядит следующим образом:
try { // защищённый код } catch( ExceptionName e1 ) { // блок catch } catch( ExceptionName e2 ) { // блок catch } catch( ExceptionName eN ) { // блок catch }
Вы можете перечислить несколько операторов catch, чтобы ловить разные типы исключений, если ваш блок try может вызвать более одного типа исключений в различных ситуациях.
Исключения можно бросить в любом месте блока кода с использованием команды throw. В оператор throw передаётся любое выражение, тип результата этого выражения должен определять тип созданного исключения.
В следующем примере выбрасывается исключение в случае попытки деления на ноль:
double division(int a, int b) { if( b == 0 ) { throw new Exception("Ситуация деления на ноль!"); } return (a/b); }
Блок catch после блока try вылавливает любое исключение. Вы можете указать, какой тип исключения вы хотите поймать, и он будет определяться объявлением об исключении, которое должно находиться в круглых скобках, следующих за ключевым словом catch.
try { // защищённый код } catch( ExceptionName e ) { // код для обработки исключения ExceptionName }
Код, показанный выше, позволяет обработать исключения типа ExceptionName. Если вы хотите указать, что блок catch должен обрабатывать любые исключения, которые могут быть брошены в блоке try, вы должны поместить многоточие ... между круглыми скобками, заключающими объявление об исключении, следующим образом:
try { // защищённый код } catch(...) { // код для обработки любого исключения }
В следующем примере генерируется исключение деления на ноль. Оно ловится в блоке catch.
import std.stdio; import std.string; string division(int a, int b) { string result = ""; try { if( b == 0 ) { throw new Exception("Нельзя делить на ноль!"); } else { result = format("%s",a/b); } } catch (Exception e) { result = e.msg; } return result; } void main () { int x = 50; int y = 0; writeln(division(x, y)); y = 10; writeln(division(x, y)); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Нельзя делить на ноль! 5