Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизЯ рехнулся или 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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.014 c