Как Delphi пытается ... кроме работы для подпроцедур? Работает ли обработка исключений для подпроцедуры? - PullRequest
1 голос
/ 24 марта 2020

Я не совсем понимаю, и я не мог найти ответ на вопрос, который меня беспокоит. Может ли блок try..except перехватить и передать исключение подпроцедуры?

Допустим, у меня есть код:

  try
    ProcedureA;
  except
    on E : Exception do
      ...
  end;

и код для процедуры A

procedure ProcedureA;
begin
  SubProcedureA;
  SubProcedureB;
  SubProcedureC;
  ...
end;

Если SubProcedureB вызывает исключение, будет ли обработано исключение на уровне главной процедуры A? Будет ли выполнена подпроцедура C? Будет ли исключение перенаправлено в процедуру А без изменений? Или, может быть, есть ограничение на подпроцедуры, например, Sub-sub-sub-процедура больше не будет передавать исключение для процедуры более высокого уровня?

Спасибо за информацию, и я прошу прощения, если это это вопрос для начинающих (который я). :)

Ответы [ 2 ]

5 голосов
/ 24 марта 2020

Если SubProcedureB вызывает исключение, будет ли обработано исключение на уровне главной процедуры A?

Да. Когда возникает исключение, оно распространяется вверх по стеку вызовов, пока соответствующий обработчик не перехватит его. Если ни один обработчик не перехватит его, то процесс обычно завершится.

Будет ли выполнена подпроцедура C?

Обычно нет , однако включен Windows по крайней мере, возможно (но не с синтаксисом Delphi except) для обработчика исключений, чтобы дать системе команду вернуться к исходному сайту вызова, вызвавшему исключение. Это полезно в редких случаях, когда обработчик исключений может фактически исправить условие, которое вызвало возникновение исключения, что позволяет продолжить выполнение с того места, где оно было прервано. Но опять же, это очень редко.

Будет ли исключение перенаправлено в процедуру А без изменений?

Обычно да . В памяти имеется только 1 Exception объект, и он передается каждому обработчику исключений в стеке вызовов, пока не будет найден соответствующий обработчик. При этом возможно для обработчика исключений перехватить исключение, изменить его (в конце концов, это всего лишь объект в памяти), а затем повторно вызвать его, чтобы продолжить поиск до вызова стек для другого обработчика. Это не так в вашем примере, но это разрешено.

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

Нет такого ограничения.

1 голос
/ 24 марта 2020

Попробуйте, кроме как блок ловит исключение на любом уровне. Исключение выдается до тех пор, пока оно не будет обработано.

Верхним уровнем является событие Application.OnException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...