Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try..except [D6, WinXP]


Страницы:   1 2 3

Hit ©   (2005-10-18 13:19:00) 

Мастера, помогите.
Пишу код и решил заюзать raise вместо возвращения кода ошибки из функции. Все шло нормально, но потом на одной из процедур после raise, я вижу свое сообщение(отлаживаюсьс IDE), но дальше какой-то мусор вместо перехода в верхний обработчик ошибок:
Project test.exe faulted with message: 'application-defined exception (code 0x0eedfade) at 0x77e73887'. Process Stopped. Use Step or Run to continue.
Куда рыть?


е1   (2005-10-19 18:02:00) [21]


> Коментарю строку с if (LocalVar1 = UnitCrypt.Crypt(Param1,
>  Param2, Param3))then все корректно работает.


А ты не комментируй, а защити блоком try..except и проверь, что за ошибка возникает.


Hit   (2005-10-19 17:51:00) [22]


> procedure Crypt(Param1, Param2, Param3: String)

сорри
function Crypt(Param1, Param2, Param3: String): String;


Hit   (2005-10-19 17:49:00) [23]


> ну хоть DoSomething1 то посмотреть можно?

Сорри, DoSomething2. Там код простой:

procedure TMyClass.DoSomething2();
var
 LoacalVar1: String;
begin
//тут работаю с БД, читаю из БД LoacalVar1
...
if (LocalVar1 = UnitCrypt.Crypt(Param1, Param2, Param3))then
begin
  ...
end else
begin
   raise Exception.Create('Error in DoSomething2');
end;
end;

procedure Crypt(Param1, Param2, Param3: String)
 function DoCryptItem(S1, S2: String): String;
 begin
   //xor-ы
    ...
 end;
begin
 Result := DoCryptItem(Result,Param1);
 Result := DoCryptItem(Result,Param2);
 Result := DoCryptItem(Result,Param3);
end;

Коментарю строку с if (LocalVar1 = UnitCrypt.Crypt(Param1, Param2, Param3))thenвсе корректно работает.


е1   (2005-10-19 17:40:00) [24]


> Прежде всего, д.б. MessageBox(Application.Handle, ..).
> Но, и это может быть небезопасно, бо следует помнить, что
> формы
> и бокс, все же, в разных потоках, и что произойдет при обработке
>
> некоего сообщения (например, таймера) в первичном потоке
>
> предсказать  непросто.


1. Ошибаешься.  Application.Handle как раз не надо указывать - здесь я создаю немодальный диалог.
2. Формы и бокс в разных потоках и ничто не мешает им иметь свои обработчики сообщений, что в данном случае и наблюдается.

Поэтому здесь коррректный и безопасный код.


umbra   (2005-10-19 17:20:00) [25]

ну хоть DoSomething1 то посмотреть можно?


Hit   (2005-10-19 17:15:00) [26]

Народ, помогите... плиз. Хоть утеште :)


Hit   (2005-10-19 16:40:00) [27]

Самое интересное, что эта функция работает уже полгода и небыло нареканий... Переписать ее не получится.
Что можно сделать?


Hit   (2005-10-19 16:23:00) [28]

Спасибо  Leonid Troyanovsky  за линки :)
Локализовал проблему. Проблема не в потоках и ексепшинах...
Проблема в функции, которая работает в DoSomething1, она на входе получает пять строковых параметров и интежер, и выдает строку. Алгоритм приветси не могу, так как у меня есть только *.dcu, т.е. есть но менять нет прав.
Функция работает, чего-то там делает(xor и всякие там операции с символами - короче шифрует строку). Выдает результат. После того как я генерю ексепшн, вылетает
Project test.exe faulted with message: 'application-defined exception (code 0x0eedfade) at 0x77e73887'. Process Stopped. Use Step or Run to continue.И показывается стек - видно, что kernel32.
Наверное где-то торочит память... Как можно не меняя эту функцию, защититься от нее?


Leonid Troyanovsky   (2005-10-19 10:14:00) [29]


> е1   (18.10.05 18:08) [19]

> Можно чуть больше умных слов добавить, чтобы было более
> аргументированно, а не


Прежде всего, д.б. MessageBox(Application.Handle, ..).
Но, и это может быть небезопасно, бо следует помнить, что формы
и бокс, все же, в разных потоках, и что произойдет при обработке
некоего сообщения (например, таймера) в первичном потоке
предсказать  непросто.
Поэтому, при обработке исключений во вторичных потоках также
лучше придерживаться общего правила:
если нужно чего-то показывать, то поручим сделать это первичному
потоку путем Synchronize.

--
Regards, LVT.


е1   (2005-10-18 18:08:00) [30]


> evvcom ©   (18.10.05 16:54) [17]
>
>
> > Это пример для демонстрации
>
> Это неправильный пример, а посему его вредно демонстрировать.
>


Можно чуть больше умных слов добавить, чтобы было более аргументированно, а не звучало как "трындеж"?


Anatoly Podgoretsky   (2005-10-18 17:05:00) [31]

procedure TMyClass.DoSomething();
begin
// try
  DoSomething1();
  DoSomething2(); // после того как тут срабатывает raise, почему-то обработчик не уходит в блок except, а идет к методу DoSomething3
  DoSomething3();
// except
//   rasie; // re-raising для передачи в поток
// end;
end;


evvcom   (2005-10-18 16:54:00) [32]


> Это пример для демонстрации

Это неправильный пример, а посему его вредно демонстрировать.


е1   (2005-10-18 16:16:00) [33]


> Leonid Troyanovsky ©   (18.10.05 16:13) [15]


Это пример для демонстрации.


Leonid Troyanovsky   (2005-10-18 16:13:00) [34]


> 1   (18.10.05 16:01) [13]


> try
>   Synchronize(DoSync);
> except
>   on E: Exception do MessageBox(0,PChar(E.Message),'Err',MB_OK);
> end;

Не надо так делать.
Показ исключений в потоке нужно синхронизировать.
http://groups.google.com/group/fido7.su.windows.prog/msg/b5bdc95319027a8a

--
Regards, LVT.


Leonid Troyanovsky   (2005-10-18 16:05:00) [35]


> Hit   (18.10.05 15:56) [12]


Tutorial on thread programming in Delphi:

http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
http://www.sklobovsky.com/community/threadmare/threadmare.htm

Handling exceptions in a thread:
http://community.borland.com/article/0,1410,10452,00.html


> > Необработанное исключение во вторичном потоке.
>
> Это каК?


RTL дельфи не обрабатывает исключения во вторичных потоках.
А Windows снимает процессы, в которых возникли необработанные
исключения.

--
Regards, LVT.


е1   (2005-10-18 16:01:00) [36]


> han_malign ©   (18.10.05 15:50) [11]


Прекрасно поднимается исключение в доп. поток

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

procedure Test1;
procedure Test2;
procedure Test3;

implementation

uses Unit2;

{$R *.dfm}

procedure Test1;
begin
end;

procedure Test2;
begin
 raise Exception.Create('Raise test2');
end;

procedure Test3;
begin
 raise Exception.Create('Raise test3');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 t: TTest;
begin
 t := TTest.Create(False);
end;

end.

------------------------------
unit Unit2;

interface

uses
 Classes,windows,SysUtils;

type
 TTest = class(TThread)
 private
   { Private declarations }
   procedure doSync;
 protected
   procedure Execute; override;
 end;

implementation

uses
 Unit1;

{ TTest }

procedure TTest.doSync;
begin
 try
   Unit1.Test1;
   Unit1.Test2;
   Unit1.Test3;
 except
   raise;
 end;

end;

procedure TTest.Execute;
begin
 FreeOnTerminate := True;
 try
   Synchronize(DoSync);
 except
   on E: Exception do MessageBox(0,PChar(E.Message),'Err',MB_OK);
 end;
end;

end.


Hit   (2005-10-18 15:56:00) [37]


> [9] Leonid Troyanovsky ©   (18.10.05 15:46)

Виноват, исправлюсь.


> RTFM, RTFM, RTFM
> Ссылочку на туториалы я вчерась кидал.

Можно еще раз. плиз.


> Необработанное исключение во вторичном потоке.

Это каК?


han_malign   (2005-10-18 15:50:00) [38]


> Есть поток, который в методе Synchronizeдергает методы
> из других юнитов.


> Почему исключение at 0x77e73887, т.е. по такому адресу?

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


Leonid Troyanovsky   (2005-10-18 15:50:00) [39]


> Hit   (18.10.05 15:12) [4]
> И еще, еси запускать без делфи, то прога ничего не выдает
> - уходит в небытие....


Хе-хе. С этого б и начал.
Необработанное исключение во вторичном потоке.

RTFM, RTFM, RTFM
Ссылочку на туториалы я вчерась кидал.

--
Regards, LVT.

PS Т.е., все, что ты рассказывал о своем коде - туфта.


Leonid Troyanovsky   (2005-10-18 15:46:00) [40]


> Hit   (18.10.05 14:36) [3]

> Есть поток, который в методе Synchronize дергает методы
> из других юнитов.
> Так вот, один такой метод(в котором трабл) выглядит так(упрощенно):



Приведенное содержит даже синтаксические ошибки,
чего ты предлагаешь разбирать?

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

Зачем нам знать про какие-то IsTrue, DoSomething1, DoSomething3 и др.,
что к делу не относится.
Как, собс-но, и комментарий, иллюстрирующий незнание RTFM.

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

--
Regards, LVT.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо