Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1132736234
BaryV
2005-11-23 11:57
2006.10.01
Специально Владимиру Кладову и Ко...


15-1157772748
SergP
2006-09-09 07:32
2006.10.01
Почему нет доступа?


2-1158151015
Endi
2006-09-13 16:36
2006.10.01
Function


15-1157751942
Real
2006-09-09 01:45
2006.10.01
Убегающий вперед звук в фильмах


2-1158250956
ph0sgen
2006-09-14 20:22
2006.10.01
перевести тип с С++ на Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский