Предположим, у меня есть три (или более) процедуры, некоторые из которых называют друг друга, как показано ниже, любой из которых может выйти из строя.Каков правильный способ вложения исключений? - Использование Delphi
Если какой-либо из них не работает, я хочу, чтобы «главная» программа немедленно регистрировала сбой и завершала программу.
Каков правильный синтаксис для использования в Delphi для «возврата» исключения к каждому предыдущему вызову процедуры?
Еще лучше, если кто-то может помочь мне получить блок Try/except основной программы, чтобы определить, какой бит не удалось!
Пример псевдокода из трех процедур и основной программы может выглядеть следующим образом.
(я думаю, я понимаю принцип, что-то делать с «рейз», но хотел бы получить некоторую помощь с фактическим синтаксисом и какой код должен я использовать)
//////////////////////////////////////
Procedure DoProcA
begin
try
begin
{stuff}; //stuff that might fall
end;
except
on E : Exception do
begin
LogError ('error in A');
end //on E
end;//try
//////////////////////////////////////
Procedure DoProcB
begin
try
begin
Do ProcC; //another proc that might fail
{other stuff}
end;
except
on E : Exception do
begin
LogError ('error in B');
end //on E
end;//try
//////////////////////////////////////
Procedure DoProcC
begin
try
begin
{Do stuff} //even more stuf fthat might fail
end;
except
on E : Exception do
begin
LogError ('error in C');
end //on E
end;//try
//////////////////////////////////////
//Main programo
begin
try
DoProcA;
DoProcB;
{other stuff}
except
{here I want to be able to do something like
if failure of A, B or C then
begin
LogError ('Failure somewhere in A, B or C');
application.terminate;
end;}
end; //try
end.
application.terminate есть, потому что код, где все это может быть запущена либо вручную, либо, если программа называется с помощью запланированного задания, передавая параметр. (Я тестирую, если это так и заканчивается, если оно есть). В настоящий момент у меня возникают проблемы, потому что если произойдет исключение, программа может висеть, а затем в следующий раз, когда планировщик попытается запустить задание, которое не работает, когда работа уже запущена. Таким образом, идея состоит в том, чтобы убедиться, что если он запускается с параметром командной строки, тогда любое исключение заставляет программу прекращать работу правильно и в идеале, запишите, почему она не удалась. – user3209752
'Application.Terminate()' просто отправляет сообщение 'WM_QUIT' в очередь сообщений вызывающего потока. 'Application.Run()' запускает фактический цикл сообщения. Если вы не вызываете 'Application.Run()' или иначе запускаете свой собственный цикл сообщений, 'Application.Terminate()' бесполезен. Просто выйдите из основного блока 'begin/end.', чтобы завершить процесс. И сами исключения не вызывают зависаний. Ваш код должен был бы что-то делать в ответ на пойманное исключение, чтобы зависать, например, отображать окно модального всплывающего окна, которое пользователь должен (но не сможет) уволить. –
Спасибо Remy, очень полезный материал - и несколько указателей на то, где моя программа может быть неудачной. У меня действительно есть несколько сообщений, чтобы показывать исключения для интерактивного пользователя. Бьюсь об заклад, один из них показывает, когда он запускается как запланированное задание. Трудно узнать, кому отдать ответ, вы или Дэвид, поскольку вы оба всегда очень полезны. В этом случае, как говорит сам Давид, он дал мне очень полезный совет, но вы ответили на вопрос напрямую, поэтому я думаю, что победитель должен быть Реми для ответа на этот вопрос. Благодаря обоим. – user3209752