Форум: "Прочее";
Текущий архив: 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
в mainbegin
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