В этом уроке мы поговорим о том, что же такое исключительные ситуации. 
Исключительной ситуацией называется такая ситуация, когда происходит какая-либо ошибка во время выполения программы и ее дальнейшая работы принудительно прерывается. Ситуаций таких, уж поверьте, существует огромное множество. Возьмем банальнейший пример такой ситуации — деление на ноль. Конечно же, заранее предусмотреть ее достаточно легко, например проверять число на ноль, прежде чем делить на него. Но отследить все невозможно, особенно если программа «падает», например, из-за обращения к несозданному ранее объекту (Ошибка — Access Violation). Именно поэтому гораздо легче использовать обработку исключительных ситуаций в Delphi. Они позволяют без поиска причины возникновения ошибки отловить любую исключительную ситуацию в определенном участке кода, и произвести, если необходимо, определенные операции, т.е. обработать ошибку. Рассмотрим пример исключительной ситуации:
 
 
 
 | 
  1 
  
 2 
  
 3 
  
 4 
  
 5 
  
 6 
  | 
  
  var s: TStringList; 
  
 begin 
  
   s.Add('test'); // попытка обратиться к несозданному объекту.  
  
   //(Нужно было ранее его создать "s := TStringList.Create;") 
  
   //Именно во время выполнения той строчки и возникнет ошибка 
  
 end; 
  | 
  
 
 
 
Прежде чем отловить эту ошибку, давайте сначала рассмотрим синтаксис конструкции try — except: 
 
 
 | 
  1 
  
 2 
  
 3 
  
 4 
  
 5 
  
 6 
  
 7 
  
 8 
  
 9 
  
 10 
  | 
  
  try 
  
   //определенные операции 
  
   //в которых возможно выпадает ошибка 
  
 except 
  
   //обработка исключительной ситуации 
  
   //если произошла исключительная ситуация,  
  
   //то все последующие операции между try и except будут 
  
   //пропущены, затем выполнены операции, которые 
  
   //находятся после ключевого слова except 
  
 end; 
  | 
  
 
 
 
Рассмотрим способ отлова ошибки из первого кода: 
 
 
 | 
  1 
  
 2 
  
 3 
  
 4 
  
 5 
  
 6 
  
 7 
  
 8 
  | 
  
  var s: TStringList; 
  
 begin 
  
   try 
  
     s.Add('test'); 
  
   except 
  
     showmessage('Обращение к несозданному объекту'); 
  
   end; 
  
 end; 
  | 
  
 
 
 
Важной особенностью такой обработки исключительной ситуации является то, что само окно с ошибкой не отобразится. Отобразится только то текстовое сообщение, которые мы указали между except и end. 
Если оставить обработчик исключения пустым, т.е. ничего не писать между except и end, то ошибка будет по сути «проигнорирована». Однако это не значит, что она не произошла, ведь работа того кода, который находится между try и except была прервана аварийно. 
Рассмотрим немного другую конструкцию — try — finally: 
 
 
 | 
  1 
  
 2 
  
 3 
  
 4 
  
 5 
  
 6 
  
 7 
  
 8 
  | 
  
  try 
  
   //определенные операции 
  
   //в которых возможно выпадает ошибка 
  
 finally 
  
   //операции, которые будут выполнены в любом случае 
  
   //если исключения не произошло 
  
   //или оно произошло 
  
 end; 
  | 
  
 
 
 
Получение текста самой ошибки: 
 
 
 | 
  1 
  
 2 
  
 3 
  
 4 
  
 5 
  
 6 
  | 
  
  Try 
  
   //Вызываем ошибку 
  
 Except 
  
   on E : Exception do 
  
     ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message); 
  
 end; 
  | 
  
 
 
 
 
   
 
		
	  |