Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Я рехнулся или Delphi?   Найти похожие ветки 

 
Reindeer Moss Eater ©   (2006-09-11 14:28) [40]

procedure TForm1.OnMyMsg(var Msg: TMessage);
begin
Writeln;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
{$I+}
try
 Writeln;
except
 ShowMessage("Оппа!");
end;

try
 SendMessage(Handle,WM_MYMSG,0,0);
except
 ShowMessage("С какой стати здесь чего-то ждать?");
end;
end;


 
vl_chel ©   (2006-09-11 14:33) [41]

но возможно я ошибся

procedure TForm1.Edit1Change(Sender: TObject);
begin
 ShowMessage("12");
 raise Exception.Create("Error");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
 Edit1.Text := "33445";
 ShowMessage("11");
except
 ShowMessage("M Error");
end;

end;

Переход на обработку исключения вообще не происходит????

пишет:
12
Error
11

Хотя по логике код обработчика должен быть снят с выполнения и 11 выводиться не должно ??
В случае такого кода все работает вполне корректно
try
 Edit1.Text := "33445";
 raise Exception.Create("Error");
 ShowMessage("11");
except
 ShowMessage("M Error");
end;

12
Error
M Error

Возможно это связано со спецификой внутренней обработки исключений в VCL


 
han_malign ©   (2006-09-11 14:46) [42]


> Спасибо! Это что ж получается - дефолтный обработчик вызывается
> раньше моего?!!! Дурдом... И в каком же хелпе такая дикость
> описана....
>
> А главное - как это обойти-то...

- если ты это обойдешь, то разрушишь очередь сообщений окна.


 
han_malign ©   (2006-09-11 14:58) [43]


> han_malign ©   (11.09.06 14:46) [42]

можешь убедиться сам:
procedure TForm1._exc(Sender: TObject; E: Exception);
begin
  raise  E.ClassType.Create;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException:= _exc;
end;


Единственный приемлемый вариант востановления исключения VCL, возникающего в очереди сообщения, это запомнить его в глобальной переменной, "перекрыть" SendMessage, в котором, после отработки генерить "запомненное" исключение. Но это приведет к значительным накладным расходам, ловить будет не все(отложенные нотификации не пройдут),так что понятно почему разработчики Borland по этому пути не пошли...


 
IGray   (2006-09-11 15:24) [44]


> Elen ©   (11.09.06 14:12) [34]
> А чем [14] не подходит? Поподробнее обрисуй ссуть...

Суть в том, что крайне неудобно быть обязаным все исключения полностью подавлять внутри обработчиков событий. В большинстве случаев удобно и правильно "выпустить" исключение "на самый верх" к дефолтному обработчику, который я перекрываю, чтоб отправить письмо разработчику (мне) с инфой об ошибке.
А теперь выясняется, что вся стройная и логичная система летит к черту :-(

------------------
Я тут выполнил простецкий поиск по исходникам дельфийских модулей, и мне открылась страшная правда - во многих местах встречается код:

try
 ...
except
 Application.HandleException(Self);
end;

Т.е. дефолтная обработка исключений ДЕЦЕНТРАЛИЗОВАНА!
Насколько я понимаю, отсюда вытекают следующие проблемы (как минимум):

1. Раз дефолтное подавление исключения может произойти до моего обработчика (размещенного "по месту"), то как мне узнать, что исключение ВООБЩЕ было и КАКОЕ?

2. Если я перекрываю дефолтный обработчик - как внутри него мне узнать, в каком КОНТЕКСТЕ он был вызван?

Подозреваю, что это еще и не все проблемы, так что мне всё-таки кажется борландовцы тут что-то перемутили...


 
IGray   (2006-09-11 15:29) [45]


> Reindeer Moss Eater
try
SendMessage(Handle,WM_MYMSG,0,0);
except
ShowMessage("С какой стати здесь чего-то ждать?");
end;

Если бы вместо SendMessage ты использовал PostMessage я бы ничего и не ждал, но SendMessge полностью отрабатывается там где написано, т.е. до except, поэтому моё ожидание считаю логичным...


 
Наиль ©   (2006-09-11 15:35) [46]


> Если бы вместо SendMessage ты использовал PostMessage я
> бы ничего и не ждал, но SendMessge полностью отрабатывается
> там где написано, т.е. до except, поэтому моё ожидание считаю
> логичным...

SendMessage может быть и не твоим.
Неужели вражеская программа должна подрываться на твоих ошибках, при оращении к контролам твоей программы?


 
Reindeer Moss Eater ©   (2006-09-11 15:42) [47]

А что это меняет? Ничего.
Кодовый поток дошел до синхронного вызова. Сообщение отправлено.
Какой код после этого и в каком процессе при этом запускается - delphi по барабану.

поэтому моё ожидание считаю логичным...

Вот допустим есть приложение (чьё-то не мое и не твое) с окном. И у этого окна есть обработчик сообщения. И в нем выполняется потенциально опасный код могущий генерировать исключения.

По твоей логике, если написать сбоку еще одно приложение, и из него отправить сообщение в то первое приложение и обернуть вызов в обработчик, то это второе приложение должно чудесным образом загасить исключения в первом приложении.


 
Reindeer Moss Eater ©   (2006-09-11 15:45) [48]

А если сообщение посылается из прилады сделанной с помощью компилятора, не имеющего представления вообще об обработке исключений?


 
Elen ©   (2006-09-11 15:51) [49]


>  дефолтная обработка исключений ДЕЦЕНТРАЛИЗОВАНА!

Для таких задач Борланд придумал TException. Рули им.


 
IGray   (2006-09-11 16:04) [50]


> По твоей логике, если написать сбоку еще одно приложение,
>  и из него отправить сообщение в то первое приложение и
> обернуть вызов в обработчик, то это второе приложение должно
> чудесным образом загасить исключения в первом приложении.


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

> А если сообщение посылается из прилады сделанной с помощью
> компилятора, не имеющего представления вообще об обработке
> исключений?

А если сообщение посылают инопланетяне?
;-)


 
Reindeer Moss Eater ©   (2006-09-11 16:14) [51]

Ну в общем я вижу, что ты все же понял


 
Наиль ©   (2006-09-11 16:16) [52]


> Возможно первое сообщает второму через исключение

главное слово -  возможно.
Нельзя опирается на то, что есть вероятность.
Поэтому Борланд оставляет исключения которые возможно пришли из вне, себе. Программист должен быть уверен, что ошибки в других программах не повлияют на его (правильно написанную) программу.



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.048 c
3-1153861644
Couter Terranist
2006-07-26 01:07
2006.10.01
Ошибка при откате БД


15-1157540820
Гарри Поттер
2006-09-06 15:07
2006.10.01
Мост в Екатеринбурге. Моя версия :)


15-1157988739
Дураг
2006-09-11 19:32
2006.10.01
Два “тяжелых” вопроса на сегодняшнем кандминимуме.


1-1155801487
lex67
2006-08-17 11:58
2006.10.01
Как сделать паузу


2-1157877145
zopa
2006-09-10 12:32
2006.10.01
class / class(TObject)