Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> try..except, не работают без модуля Forms ?! 
:(
    Опции темы
RaIDeR
Дата 26.9.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 1
Всего: 4



Удивительно smile try..except и try..finally не работают если модуль Forms не подключен,
к примеру проверьте у себя вот этот код:

Код

program Project1;

uses
  Windows, Messages{, Forms};

var
  WndMsg: tagMSG;
  hWindow: HWND;
  WndClass: TWndClass;

procedure Test_Exception;
var
  P: PChar;
begin
  try
    FreeMem(P); // Специально вызываем исключение
  except
    MessageBox(0, 'Error ?!', 'Error', MB_ICONERROR);
  end;
end;

function WindowProc(Window: HWND; Msg: UINT; wParam, lParam: LongInt) : LongInt; stdcall;
begin
  case Msg of
    WM_CREATE: Test_Exception;
    WM_DESTROY: PostQuitMessage(0);
  else
    Result := DefWindowProc(Window, Msg, wParam, lParam);
  end;
end;

begin

  with WndClass do
  begin
    Style         := 0;
    lpfnWndProc   := @WindowProc;
    cbClsExtra    := 0;
    cbWndExtra    := 0;
    hInstance     := 0;
    hIcon         := 0;
    hCursor       := 0;
    hbrBackground := 0;
    lpszMEnuName  := nil;
    lpszClassName := 'CLASS_NAME';
  end;

  if RegisterClass(WndClass) = 0 then Halt;

  hWindow := CreateWindow('CLASS_NAME', nil, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, 0, 0, hInstance, nil);
  ShowWindow(hWindow, SW_SHOW);


  while GetMessage(WndMsg, 0, 0, 0) do
  begin
    TranslateMessage(WndMsg);
    DispatchMessage(WndMsg);
  end;

end.


В случае с try..except, у меня вылетает ошибка "Runtime error 216 at XXXXXX",
и прога аварийно завершается, а в случае с try..finally, всё тоже, за исключением того
что код, следующий после finally, всё же исполняется ... а если подключить модуль
Forms - всё ок ! В чём проблема ???

ps
Может у меня Delphi глючет ...
PM MAIL   Вверх
Rrader
  Дата 27.9.2005, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Дело в том, что исключения обрабатываются потомками класса Exception (и им самим). Отсюда следует, что для правильной обработки исключений нужно подключить модуль SysUtils. smile

P. S.
Модуль Forms ссылается на SysUtils smile

Это сообщение отредактировал(а) Rrader - 27.9.2005, 08:10


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Петрович
Дата 27.9.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Ответ правильный, но не совсем точный.
Да, если модуль SysUtils не включен в программу, то механизм перехвата исключений не будет запущен. В таком случае, исключения будут приводить к автоматической остановке программы с сообщением о Runtime Error.

Автор топика же, не совсем правильно пытается вызвать исключение. Дело в том, что его:
Код

FreeMem(P); // Специально вызываем исключение

как раз обычно не будет вызывать исключения! Все будет определяться значением переменной p. А поскольку она локальная, то ее значение в принципе неопределено!
Правильнее, использовать более надежные методы генерации исключений. Например, если переписать твою процедуру так:
Код

procedure Test_Exception;
begin
  try
    pChar(Nil)^ := 'a';
    MessageBox(0, 'No Error ?!', 'No Error ', MB_ICONERROR);
  except
    MessageBox(0, 'Error ?!', 'Error', MB_ICONERROR);
  end;
end;

То и результат будет несколько иным. smile

Это сообщение отредактировал(а) Петрович - 27.9.2005, 16:24


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
RaIDeR
Дата 28.9.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 1
Всего: 4



Спасибо что обьяснили !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.