Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

Нужна помощь написании модуля exception   Найти похожие ветки 

 
ДжекиМайер   (2007-03-14 00:22) [0]

наподобие
procedure TForm1.FormCreate(Sender: TObject);
Application.OnException:=ApplicationEvents1Exception;

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
MessageBox(
halt;


только у меня все на АПИ и форм нет , а это не проходит
uses  Windows,Messages;

желание из-за этого добавлять uses Form для этого нет никакого,
грузит чужие длл,которые могут валится, исходников их нет

непредлагать :
madcollection
EurekaLog
JediVCL + FastMM4
и это http://delphimaster.net/view/15-1172580809/


1) код нужен по минимуму.
В начале приложения в main вызывать типа SetHookExcept();
Если приложение совершило "тяжелую" ошибку (не try except) ,
а VA read.write то начинает выполнятся функция ExceptEXE().
Там я могу сделать MessageBox/запись данных вычислений/запуск своего приложения/halt
Просмотр стека итп ненужен.

2)для проверки надо *.dcu дабы я протестил методом

var
p:^dword;
begin
p^:=3333;

только описать  как вызвать надо хук, а в ExceptEXE() любое сообщение

3)скромное вознагражнение WMZ WMR , только сколько ?
tempmail2005@mail.ru


 
Ketmar ©   (2007-03-14 00:39) [1]

предлагаю метлу.


 
Servelat ©   (2007-03-14 00:55) [2]

> [1] Ketmar

Ketmar - Бессменный продавец метел (=. Надо сочинить хоку по этому поводу.


> [0]

Учимся работать с поисковиками: www.google.ru например.

Возможна вот эта статья поможет в решении проблем (честно сказать, из-за странной терминологии, довольно смутно понял, чего ж Вам нужно).

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833


 
Ketmar ©   (2007-03-14 01:32) [3]

> Servelat ©   (14.03.07 00:55) [2]
> Ketmar - Бессменный продавец метел

а что делать? меня самого такое не радует, но...


 
Германн ©   (2007-03-14 03:17) [4]

Я уже предлагал автору купить Эврику. Всего-то примерно 2700 руб. Так что же он имеет в виду под "3)скромное вознагражнение WMZ WMR , только сколько ?" ?
Ну куда уж скромнее? :)


 
KSergey ©   (2007-03-14 07:51) [5]

Автору: вы ждете волшебства там, где его нет и быть не может.
Вам достаточно просто посмотреть реализацию метода TApplication.Run() и увидеть, что там нет никакого волшебства, а еть конструкция примерно такого вида (под рукой нет, пишу все очень приметно; имя метода тоже погу переврать, но не поленитесь, гляньте в dpr лобого проекта с формами - чего тама вызывается) (сорри за синтаксис, давно это было :)):

TApplication.Run()
begin
 try
   // тут подгтовительные действия и
   // цикл диспетчеризации сообщений, т.е. фактически работа программы
 except (e: Exception)
   if Assigned(onException) then
     onException(e)
  else
     ShowException(e);  // тут какой-то метод стандартного отображения
   end;
 end;
end;

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

Важно вот что: вам следует сделать тоже самое: просто весь код, где происходит основная работа - обравить try/exception, а уже внутри этой конструкции отлавливать исключения и вызывать ту самую ExceptEXE().

Как именно вы ее будете взывать - тут нет предела фантазии: хардкоденый вызов конкретной ф-ции, переменная, где эта ф-ция задается той самой SetHookExcept() или еще как - не важно.
Главное - не надо искать волшебства. Не за чем. Весь доступный инструментарий у вас уже есть.


 
Loginov Dmitry ©   (2007-03-14 07:58) [6]

> Весь доступный инструментарий у вас уже есть.


Это VCL ;))


 
Rouse_ ©   (2007-03-14 10:19) [7]


> JediVCL + FastMM4

Не понял, а FastMM4 это по максимуму чтоли? Он только Windows и использует...


 
KSergey ©   (2007-03-14 11:49) [8]

> Loginov Dmitry ©   (14.03.07 07:58) [6]
> Это VCL ;))

Что "Это"?
Класс Exception никак не связан с формами. Так что ничего не мешает его использованию в проекте "у меня все на АПИ и форм нет".

Автору: а что значит фраза

>  а это не проходит
> uses  Windows,Messages;

??


 
Ketmar ©   (2007-03-14 14:33) [9]

> KSergey ©   (14.03.07 11:49) [8]
неко ожидало найти в windows.pas TApplication и TForm, видимо.


 
ДжекиМайер   (2007-03-16 23:21) [10]

вопрос в силе
обьясню задачу иначе , проснилось кое-что тем неменее вопрос не решен

Нарыл замечательную статью Комплексный контроль за качеством кода
исходник 8 килобайт тут http://www.delphimaster.ru/articles/errors/testassert.zip

там модуль ATSAssert.pas и проект все замечально работает,
окошко с ошибкой выскакивает с ОДНОЙ кнопкой и описанием

подключаю к своему проекту (подрезаному до нуля)

program window22;

uses
 Windows,
 Messages,
 ATSAssert; // вот он

var
 WinClass: TWndClassA;
 Inst, Handle: Integer;
 Msg: TMsg;

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 if uMsg = WM_DESTROY then
   halt;
end;

procedure TIMEERROR;
var
 WrongPointer : PInteger;
begin
WrongPointer  := nil;
WrongPointer^ := 100;
end;

begin
 Inst := hInstance;
 with WinClass do
 begin
   style              := CS_CLASSDC or CS_PARENTDC;
   lpfnWndProc        := @WindowProc;
   hInstance          := Inst;
   hbrBackground      := color_btnface + 1;
   lpszClassname      := "AG_TESTWINDOW";
   hCursor            := LoadCursor(0, IDC_ARROW);
 end; { with }
 RegisterClass(WinClass);
 Handle := CreateWindowEx(WS_EX_WINDOWEDGE, "AG_TESTWINDOW", "Amigreen TestWindow 1.00",
                          WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
                          363, 278, 305, 65, 0, 0, Inst, nil);
 SetTimer(handle,21,1000,@TIMEERROR);

 while(GetMessage(Msg, Handle, 0, 0)) do
 begin
   TranslateMessage(msg);
   DispatchMessage(msg);
 end;
end.


отметил увеличение размера с 15 кб до 283 кб, вот тебе и сэкономили на форме (
неудивительно ATSAssert.pas использует SysUtils, Forms, а там ***на хватает

Погналися за зайцем, а он по морде настучал

выполняю - не работает, та же ***нее окошко , результата ноль

вот такой бы модуль для апишных окошек и без SysUtils, Forms и чтоб работал!


 
ДжекиМайер   (2007-03-16 23:22) [11]

Удалено модератором
Примечание: Дубль...


 
DrPass ©   (2007-03-16 23:50) [12]


> ДжекиМайер   (16.03.07 23:22) [11]

Ну а что ты хотел? Этот замечательный модуль просто использует обработку исключений в TApplication. В твоей программе не используется TApplication, соответственно, не ловятся и исключения :)


 
ДжекиМайер   (2007-03-17 00:58) [13]

вот я про тоже писал в [1]
мне  надо без TApplication а он в Form.pas сидит

>Класс Exception никак не связан с формами.
>Так что ничего не мешает его использованию


 
Джо ©   (2007-03-17 02:35) [14]

Кетмар, возьми в долю, а? Воистину, бизнес продавания метл не потеряет актуальности.


 
Германн ©   (2007-03-17 02:51) [15]


> Джо ©   (17.03.07 02:35) [14]
>
> Кетмар, возьми в долю, а? Воистину, бизнес продавания метл
> не потеряет актуальности.
>

Похоже у Кетмара сейчас большие проблемы со складом! И с поставщиками  мётел тоже :)
Ну и, однако, сей бизнес стоит наладить! Кто купит "метлу" просто так!? :)


 
Alex Konshin ©   (2007-03-17 07:47) [16]

Честно говоря, для каких мирных целей может быть важен размер файла.
Автор уже мне писал. Видно же, что не разбирается в вопросе, а делает какие-то утверждения. Я ему ясно сказал, что мой трассировщик не требует Forms - не поверил. Да я и не расстраиваюсь. В таком случае проще сказать, что нельзя, чем объяснять как можно.

Сам try ... except не требует ничего, кроме System. И использовать его можно.
А вот класс Exception описан в SysUtils. Кстати, растрелял бы через повешенье того м... чудака в Borland, кто придумал такой дизайн. Но, опять-таки, это не значит, что try...except нельзя использовать. Только в этом случае думать надо, а не компоненты искать.


 
Kedge ©   (2007-03-17 07:55) [17]

>[16] Alex Konshin ©   (17.03.07 07:47)
>Честно говоря, для каких мирных целей может быть важен размер файла.
А может автору важен не размер, а отсутствие SysUtils (например для использования через AppInit_Dlls) ?
IMHO - это более вероятная причина :)


 
ДжекиМайер   (2007-03-17 10:17) [18]

[17] включение SysUtils увеличивает размер с 18 до 41 Kb
dll это позже, после этого)

[4]
в лом качать по модему эврику тринадцати метровую

[16] да формс не требует , а как его использовать - у меня модуль не работает

program window33;

uses
 Windows,
 Messages,
 DebugUtils;

var
 WinClass: TWndClassA;
 Inst, Handle: Integer;
 Msg: TMsg;

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 if uMsg = WM_DESTROY then
   halt;
end;

procedure TIMEERROR;
var
 WrongPointer : PInteger;
begin
WrongPointer  := nil;
WrongPointer^ := 100;
end;

begin

DebugUtils.HookException(PrintToConsoleAndODS);

 Inst := hInstance;
 with WinClass do
 begin
   style              := CS_CLASSDC or CS_PARENTDC;
   lpfnWndProc        := @WindowProc;
   hInstance          := Inst;
   hbrBackground      := color_btnface + 1;
   lpszClassname      := "AG_TESTWINDOW";
   hCursor            := LoadCursor(0, IDC_ARROW);
 end; { with }
 RegisterClass(WinClass);
 Handle := CreateWindowEx(WS_EX_WINDOWEDGE, "AG_TESTWINDOW", "Amigreen TestWindow 1.00",
                          WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
                          363, 278, 305, 65, 0, 0, Inst, nil);
 SetTimer(handle,21,1000,@TIMEERROR);

 while(GetMessage(Msg, Handle, 0, 0)) do
 begin
   TranslateMessage(msg);
   DispatchMessage(msg);
 end;
end.


таже стандартная ошибка, с двумя кнопками.
DebugUtils.pas
MapParser.pas
defines.inc
MemoryMap.pas
StackTracer.pas  в проекте

размер увеличился с 18 до 54 Kb


 
Loginov Dmitry ©   (2007-03-17 18:24) [19]

> размер увеличился с 18 до 54 Kb


А что, размер должен вниз расти, что-ли?


 
ДжекиМайер   (2007-03-17 18:54) [20]

ага увеличение в 2-3 раза от основного веса ,это много,
макс +20кб


 
Игорь Шевченко ©   (2007-03-17 19:00) [21]

Размер не имеет значения


 
Loginov Dmitry ©   (2007-03-17 21:13) [22]

> макс +20кб


Код прибавляет вес ехе-шнику. Такое уж у него свойство. +20кб отнюдь не много. Перепиши все модули заново, вдруг и вправду тебе удастся уменьшить ехе-шник на 1-2 кбайта. Дерзай. А лучше прислушайся к [21].


 
ДжекиМайер   (2007-03-17 23:40) [23]

какие модули ?

ни один модуль не заработал в составе приложения в [18],
ни ATSAssert.pas (где есть Forms)
ни DebugUtils.pas упомянутый в теме
http://delphimaster.net/view/15-1172580809/

[16]класс Exception описан в SysUtils

а как его использовать ? ,выхода нет
знаю только Forms.pas  TApplication.Except...


 
Loginov Dmitry ©   (2007-03-18 09:04) [24]

> класс Exception описан в SysUtils


Не используй VCL. Опиши свой Exception.

Exception = class(TObject)
private
 FMessage: string;
public
 property Message: string read FMessage write FMessage;
end;

(это будет первая спица от 3-угольного колеса :)


 
ДжекиМайер   (2007-03-18 10:46) [25]

type
 Exception = class(TObject)
private
FMessage: string;
public
property Message: string read FMessage write FMessage;
procedure ShowException;
procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer);
end;

//0000000000000000000000000000000000000000000000000000
procedure Exception.ShowException;
  begin
    MessageBox(0, PChar(FMessage), PChar(""), MB_ICONERROR or MB_TASKMODAL);
  end;
///000000000000000000
procedure Exception.ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer);
  begin
  FMessage:="test"+#13#13+"test10";
   Exception(ExceptObject).ShowException;
   Halt(1);
  end;
//000000000000000000000


в main

begin
ExceptProc:=@Exception.ExceptHandler;


что еще добавить


 
ДжекиМайер   (2007-03-19 00:04) [26]

пошел другим путем

program window33;

uses
 Windows,
 Messages,
 SysUtils;

var
 WinClass: TWndClassA;
 Inst, Handle: Integer;
 Msg: TMsg;

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 if uMsg = WM_DESTROY then
   halt;
end;

procedure TIMEERROR;
var
 WrongPointer : PInteger;
begin
WrongPointer  := nil;
WrongPointer^ := 100;
end;

procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
  MessageBox(0, PChar("error"), PChar(""), MB_ICONERROR or MB_TASKMODAL);
 Halt;
end;

begin  {MAIN}
ExceptProc:=@ExceptHandler;

 Inst := hInstance;
 with WinClass do
 begin
   style              := CS_CLASSDC or CS_PARENTDC;
   lpfnWndProc        := @WindowProc;
   hInstance          := Inst;
   hbrBackground      := color_btnface + 1;
   lpszClassname      := "AG_TESTWINDOW";
   hCursor            := LoadCursor(0, IDC_ARROW);
 end; { with }
 RegisterClass(WinClass);
 Handle := CreateWindowEx(WS_EX_WINDOWEDGE, "AG_TESTWINDOW", "Amigreen TestWindow 1.00",
                          WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
                          363, 278, 305, 65, 0, 0, Inst, nil);
 SetTimer(handle,21,1000,@TIMEERROR);

 while(GetMessage(Msg, Handle, 0, 0)) do
 begin
   TranslateMessage(msg);
   DispatchMessage(msg);
 end;
end.


при выполнении - выскакивает "неможет быть write"жму ок- вижу свое сообщение error с одной кнопкой ,но ее не нажать,
подвисло и halt не выполняется

Почему выскакивает раньше "неможет быть write"
не понятно я ж заменил обработчик своим?


 
Ketmar ©   (2007-03-19 01:10) [27]

этот мир ничто не спасёт.
СР! УВЧ!

аффтар! не насилуй систему! подключи SysUtils и используй try...except.

зыж коллеги, может прошептать "SetUnhandledExceptionFilter"? хуже уже всё равно не будет, а смешно -- может...


 
Alex Konshin ©   (2007-03-19 01:37) [28]

> ДжекиМайер   (17.03.07 10:17) [18]
> [16] да формс не требует , а как его использовать - у меня
> модуль не работает

Естественно не заработает. Ты поотрывай крылышки мухе, а потом удивляйся, почему не летает.
Ты ведь даже не удосужился понять как это работает и зачем оно тебе нужно. Потому как если бы взглянул в код и пример, то все бы работало. А размер его на самом деле мизерный, просто он подключает SysUtils, который присутствует в нормальных программах, на которые мой модуль расчитан. При большом желании и наличии интелекта его можно исключить. Мне это не надо. Кому это нужно пусть тот и делает. Хотя, зачем этот модуль тебе вообще, если не нужен стек вызовов - ума не приложу.
Я ж тебе уже сказал, что тебе кроме try...except ничего не нужно. А уж если не хочется так, то смотри код перехвата прерываний в моем же модуле, хотя есть у меня сомнения, что это будет впрок.


 
MikePetrichenko ©   (2007-03-19 06:54) [29]

SEH (чистое API и никаких try/except) :)


 
Alex Konshin ©   (2007-03-19 12:00) [30]

> MikePetrichenko ©   (19.03.07 06:54) [29]
> SEH (чистое API и никаких try/except) :)

Можно и так, только если автор не может заставить работать рабочие модули я сильно сомневаюсь, что ему это будет по силам. Хотя я и не понимаю, почему не использовать try/except если он все равно есть и от него никак не избавиться?


 
ДжекиМайер   (2007-03-20 18:43) [31]

[30] try неловило такую ошибку,
я бы забил если приложение не зависало при сообщении

ВСЕМ КУРИТЬ БАБМУК!

написал - без всяких классов, VCL большое зло
работает - после месаги апликайшен оно прибивается!!!!



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

Форум: "Прочее";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.045 c
2-1174653515
valua
2007-03-23 15:38
2007.04.15
DivMod


15-1174417424
TUser
2007-03-20 22:03
2007.04.15
Найти хорошую дорогу


2-1174889808
Megabyte
2007-03-26 10:16
2007.04.15
Отлов нужного исключения


15-1174437630
Riply
2007-03-21 03:40
2007.04.15
Неправильный Hint :)


1-1171974507
TkN
2007-02-20 15:28
2007.04.15
Отлючить вывод служебных окон с ошибками.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский