Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Написание обработчика исключительных ситуаций...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.025 c
1-1101640437
ja
2004-11-28 14:13
2004.12.12
Как создать папку на удаленной машине?


8-1095077561
TiMER
2004-09-13 16:12
2004.12.12
скриншот изменившейся части экрана


4-1098871748
olevacho
2004-10-27 14:09
2004.12.12
запуск команд под другой учетной записью


3-1100244981
lightix
2004-11-12 10:36
2004.12.12
Сжать DBF


14-1101106133
Ozone
2004-11-22 09:48
2004.12.12
Простой растровый редактор