Обработка исключений


Предыдущая страница
Следующая страница  

Исключение – это проблема, которая может возникнуть во время выполнения программы. Это ответ D на исключительные ситуации, которые возникают во время выполнения программы, например, при попытке деления на ноль.

Исключения предоставляют способ передачи контроля из одной части программы в другую. В D обработка исключений производится с помощью трех ключевых слов: try, catch и throw.

Если предполагается, что блок может вызвать исключение, его ловят с использованием комбинации ключевых слов try и catch. Блок try/catch помещается вокруг кода, который может сгенерировать исключение. Код внутри блока try/catch называется защищённым кодом, а синтаксис использования try/catch выглядит следующим образом:

try { 
   // защищённый код 
} 
catch( ExceptionName e1 ) { 
   // блок catch 
} 
catch( ExceptionName e2 ) { 
   // блок catch 
} 
catch( ExceptionName eN ) { 
   // блок catch 
} 

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

Выбрасывание исключений в D

Исключения можно бросить в любом месте блока кода с использованием команды throw. В оператор throw передаётся любое выражение, тип результата этого выражения должен определять тип созданного исключения.

В следующем примере выбрасывается исключение в случае попытки деления на ноль:

Пример

double division(int a, int b) { 
   if( b == 0 ) { 
      throw new Exception("Ситуация деления на ноль!"); 
   }
   
   return (a/b); 
}

Вылавливание исключений из D

Блок 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

Предыдущая страница
Следующая страница