Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизНаписание обработчика исключительных ситуаций... Найти похожие ветки
← →
TankMan © (2004-11-18 17:50) [0]Не мог бы кто подсказать, вообще как можно сделать обработчик не просто выдающий тип исключительной ситуации, но еще и говорящий в какой строке была вызвана эта ошибка, но хотябы в каком модуле?
← →
Игорь Шевченко © (2004-11-18 17:52) [1]http://www.delphi-jedi.org
JCL, unit JclDebug.pas
← →
Defunct © (2004-11-18 18:38) [2]Игорь Шевченко ©
Игорь, а как вы считаете такой подход:unit unit1;
...
procedure xxx;
begin
Try
<код>
Except
Raise Exception.Create("Ошибка в модуле unit1, в процедуре "xxx"");
// можно также добавить имя класса и идентификацию искл.
end;
end;
И один глобальный обработчик, на OnException
← →
Суслик © (2004-11-18 18:43) [3]
> // можно также добавить имя класса и идентификацию искл.
а еще можно номер строки - снизу слева посмотреть :)
← →
vuk © (2004-11-18 18:46) [4]to Defunct © (18.11.04 18:38) [2]:
А не замучаетесь в каждую процедуру такой обработчик вставлять?
К тому же JCL гораздо больше полезной информации выдает. Типа трассировки стека. И без переделки всего приложения.
← →
Defunct © (2004-11-18 19:05) [5]> А не замучаетесь в каждую процедуру такой обработчик вставлять?
Да мне собсно это и не нужно. Просто было интересно рассмотреть, как вариант.
← →
GuAV © (2004-11-18 19:51) [6]2 Defunct
IMHO лучше не пересоздавать исключение, а воспользоваться уже созданным.try
<код>
except
on E: Exception do
begin
E.Message := Format("Ошибка в модуле unit1, в процедуре "xxx"" + sLineBreak + "Тип исключения %s" + sLineBreak + "%s", [E.ClassName, E.Message]);
Raise;
end;
end;
← →
KSergey © (2004-11-19 07:36) [7]Люди, скажите, как для JclDebug.pas влинковать map-файл в exe-шник? Вроде читал что можно, но не пойму как...
← →
TankMan © (2004-11-19 08:08) [8]>>Игорь Шевченко
Спасибо за помощь, только нельзя ли уточнить (что совсем точно было %) ), мне качать JCL Releases 1.93 или там где-то отдельные модули можно найти? Я почему спрашиваю - меня слово Releases смущает :( а у меня инет мееееедленный мееедленный :(
А на счет try-except все они в итоге при больших колличествах опасных мест награмождают исходники, очень не удобно читать становится :(...
← →
Digitman © (2004-11-19 10:14) [9]
> TankMan © (18.11.04 17:50)
imho, это бестолковая и лишняя затея
Если ты, к примеру, получил исключение класса EListError, то это сразу же должно навести тебя на мысль, что исключение произошло в одной из строк, где происходит явное или неявное обращение к объекту класса TList. Сейчас ты скажешь - таких строк у меня, мол, миллион может быть. Отвечу - плохо написана твоя программа, плохо она структурирована, плохо централизована в ней логика .. и никакие ухищрения с определением номера строки тебе не помогут - чем дальше, тем больше будешь путаться в своем коде, не понимая где и что в нем происходит
← →
Игорь Шевченко © (2004-11-19 11:14) [10]TankMan © (19.11.04 08:08) [8]
Качай всю Jcl - пригодится.
KSergey © (19.11.04 07:36) [7]
А там, где ты читал, не написано ? Дай ссылочку, мне тоже интересно
Digitman © (19.11.04 10:14) [9]
Ой. А сколько в VCL одинаковых исключений ?
← →
KSergey © (2004-11-19 11:53) [11]> [10] Игорь Шевченко © (19.11.04 11:14)
> KSergey © (19.11.04 07:36) [7]
> А там, где ты читал, не написано ? Дай ссылочку, мне тоже
> интересно
Ничего не помню, было давно. Вполне вероятно - что путаю.
← →
TankMan © (2004-11-19 13:28) [12]>>Digitman
Ну уж например EListError у меня точно не будет :)
Не в этом дело, дело в том что у меня достаточно много циклов и достаточно много обработки разных структур данных, проэкт не маленький - при загрузке программа подгружает настройки из файла конфигурации, в классы оболочки динамически созданных массивов, и уже потом , в памяти много чего с ними делается, и если возникнет ситуация EConvertError или EAccessViolation я не смогу сказать/предположить даже где примерно была вызвана ошибка и какими действиями, потому как на одно событие происходит множество операций над данными, что не позволяет хоть как-то примерно сказать по типу ошибки, где была вызвана она и "благодаря" чему...яж не блокнот пишу...
>>Игорь Шевченко
Еще раз спасибо...
← →
Digitman © (2004-11-19 13:33) [13]
> Игорь Шевченко © (19.11.04 11:14) [10]
> сколько в VCL одинаковых исключений ?
а по пояс сколько их ...
хреновый алгоритм всегда даст повод для заболевания геморроем
> EAccessViolation я не смогу сказать/предположить даже где
> примерно была вызвана ошибка
не надо ля-ля.
как раз именно это искл-е дает тебе исчерпывающую инф-цию о строке, где ты сотворил галиматью
← →
TankMan © (2004-11-19 13:56) [14]А зачем я тогда спрашиваю?
← →
Digitman © (2004-11-19 14:01) [15]
> TankMan © (19.11.04 13:56) [14]
> А зачем я тогда спрашиваю?
а я почем знаю, зачем ты спрашиваешь ?
ты хочешб некоей "универсальности" в решении задачи ... а оной нет и быть не может ..
конкретно же про EAccessViolation - ты наверняка не раз видел в сообщении об этом исключении слова вида ".. at address ХХХХХХХХ"
так вот эта инф-ция ХХХХХХХХ дана тебе как раз для того чтобы локализовать строку, в которой произошло исключение данного класса, а не изобретать велосипеды с "деланьем обработчиков"
← →
TankMan © (2004-11-19 14:12) [16]... дело в том что я не представляю как эти ХХХХХХ рассматривать и с какой стороны :(
Может стоит наклонить голову и посмотреть на них как на:
><
><
><
><
><
><
Я хочу сказать, а не мог бы раскрыть "секрет", я так думал что это адресс памяти по которому произошла ошибка, а не адрес строки в исходном тексте или что-то подобное...
← →
Digitman © (2004-11-19 14:34) [17]
> TankMan © (19.11.04 14:12) [16]
меню Search -> Find Error ..
все подробности - в станд.справке.
← →
KSergey © (2004-11-19 14:45) [18]> [17] Digitman © (19.11.04 14:34)
> меню Search -> Find Error ..
> все подробности - в станд.справке.
Ага, у клиента ;) А научите меня такое меню встраивать в свою прогу, плиз...
Только без jedi и map-файлов. С ними - понятно более-менее.
← →
Digitman © (2004-11-19 14:49) [19]
> KSergey © (19.11.04 14:45) [18]
> научите меня такое меню встраивать в свою прогу
не понял ... что "такое" ?
← →
vuk © (2004-11-19 14:56) [20]to Digitman © (19.11.04 14:34) [17]:
>меню Search -> Find Error ..
И как оно? Хорошо находит? Сильно помогает? Только честно.
А то, понится, когда сильно надо было, я сколько ни пытался - ни фига не нашло. В отличие от JCLDebug, которым удалось локализовать ошибку сразу, т.к. там еще и трассировка стека имеется.
← →
KSergey © (2004-11-19 15:01) [21]> [19] Digitman © (19.11.04 14:49)
> не понял ... что "такое" ?
Не надо шлангом прикидываться ;)
В упомянутом Вами посте №[18] этобыло указано.
Хотелось бы встроить в свою программу пункт меню Search -> Find Error (только не надо говорить "ну и встраивай", это уже будет не серьезно). Речь, разумеется, о том, как встроить функциональность данного пункта IDE. Опять же хотелось бы без использования jedi и map-файлов. С ними и так все знают ;)
← →
Digitman © (2004-11-19 15:14) [22]
> vuk © (19.11.04 14:56) [20]
> как оно? Хорошо находит? Сильно помогает? Только честно
мне помогает.
и достаточно часто.
если не сказать - всегда когда этот инструмент применим в данной конкретной ситуации.
> KSergey © (19.11.04 15:01) [21]
> Не надо шлангом прикидываться
> Хотелось бы встроить в свою программу пункт меню Search
> -> Find Error
не надо городить огород.
этот инструмент нужен лишь на машине разработчика, на машине клиента он нахрен не нужен.
задача твоей программы, работающей у клиента - тем или иным образом передать тебе как разработчику этот самый адрес, а уж ты как разработчик на своей собственной машине локализуешь строчку в исходниках, соответствующих актуальной клиентской версии, сымитируешь ситуацию и найдешь решение проблемы.
← →
KSergey © (2004-11-19 15:19) [23]> [22] Digitman © (19.11.04 15:14)
> образом передать тебе как разработчику этот самый адрес
> а уж ты как разработчик на своей собственной машине локализуешь строчку в исходниках
Хм, надо будет попробовать. Спасибо.
← →
vuk © (2004-11-19 15:20) [24]to KSergey © (19.11.04 15:01) [21]:
Кстати о птичках. Для того, чтобы JCLDebug выдал трассировку стека, .map не нужен. В принципе, можно получить от клиента диагностику с трассировкой (понятное дело, что софтина должна выдать это дело в форме, удобной для отсылки багрепорта), а уже потом сделать расшифровщик этой трассировки по .map в удобоваримый вид.
← →
KSergey © (2004-11-19 15:44) [25]> [24] vuk © (19.11.04 15:20)
Для того, чтобы JCLDebug выдал трассировку стека, .map не нужен
Это да, это конечно...
А вот к стати: а где этот адрес (хотя бы последний) взять? Что-то я не подсекаю...
← →
Игорь Шевченко © (2004-11-19 16:43) [26]KSergey © (19.11.04 15:44) [25]
ExceptAddr ?
← →
KSergey © (2004-11-19 16:48) [27]> [26] Игорь Шевченко © (19.11.04 16:43)
> ExceptAddr ?
Ага, спасибо
← →
TankMan © (2004-11-22 07:39) [28]>>Digitman © (19.11.04 15:14) [22]
>а уж ты как разработчик на своей собственной машине локализуешь строчку в исходниках, соответствующих актуальной клиентской версии, сымитируешь ситуацию и найдешь решение проблемы.
...извините за глупый вопрос, но... а это как сделать? можно на пальцах объяснить на примере? А то я не сталкивался с таким вот :(
← →
Digitman © (2004-11-22 08:17) [29]
> TankMan © (22.11.04 07:39) [28]
> это как сделать?
что "сделать" ? найти строчку по адресу ?
для AV - [17]
для всех прочих - [26]
← →
TankMan © (2004-11-23 19:40) [30]>>Digitman © (22.11.04 08:17) [29]
Ах нуда ... спасибо за помощь, я сколько уже на дельфи пишу и не знал :(... стока пароблем было с этим связанных :(, спасибо.
← →
TankMan © (2004-11-25 13:36) [31]>>Digitman
Ан нет, не разобрался :(, дело в том что ошибка возникает в определенном месте программы, и не с первого раза :(
А вообще реально ли реализовать такой вот обработчик, который при возникновении ошибки в уже откомпилированном ехе, выдавал сообщение что-то типа (в переводе на русский ;) ) "Произошла ошибка доступа в в модуле unit1 строка 25"... Вот... Если мне не изменяет память, я в нескольких игрушках видал сообщение такого типа, при ошибке ... или в дельфи не то?
← →
KSergey © (2004-11-25 14:29) [32]> [31] TankMan © (25.11.04 13:36)
> "Произошла ошибка доступа в в модуле unit1 строка 25
Про это в первом же ответе написано!!! Неужели нельзя было глянуть?
← →
Digitman © (2004-11-25 15:03) [33]
> TankMan © (25.11.04 13:36) [31]
видишь ли, не все так просто ...
исключение вполне может возникнуть и в коде загружаемого/используемого тобой сист.модуля, например user32.dll
сам понимаешь - никаких "юнитов" и "номеров строк" в этом случае ждать не приходится, но тем не менее ситуация вполне имеет право на жизнь ... например, из-за того, что где-то в коде своего юнита в какой-то его строке при явном/неявном вызове тобой API-ф-ции сист.модуля ты передал ей некорректный факт.параметр ... исключение же это покажет, что произошло AV и сошлется на адрес, относящийся к образу сист.модуля в АП твоего процесса, но никак не адрес строки твоего собственного Паскаль-кода, передававшего "кривой" параметр, приведший к катастрофе ...
← →
TankMan © (2004-11-25 19:26) [34]>>KSergey
Да нет почему же, я на диалапе и очень редко и не на долго выхожу поэтому эти 6мб у меня досих пор в закачке висят :(
>>Digitman
а жаль... буду докачивать сегодня JCL Releases и пробовать, я смотрю классный наборчик %)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.04 c