Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
1-1101405558
Gero
2004-11-25 20:59
2004.12.12
Прокрутка в консоли


14-1101232184
Yanis
2004-11-23 20:49
2004.12.12
ОдЁжа


6-1096625251
leonidus
2004-10-01 14:07
2004.12.12
Интеграция программы с Оперой


1-1101731361
race1
2004-11-29 15:29
2004.12.12
tobject


11-1083996308
fr!
2004-05-08 10:05
2004.12.12
как поймать message?





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