Головна сторінка
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.7 MB
Час: 0.108 c
14-1101183994
VMcL
2004-11-23 07:26
2004.12.12
Tech. support


4-1099165516
S @ shka
2004-10-30 23:45
2004.12.12
Створення та завершення потоку


14-1101333145
Труп Васі Доброго
2004-11-25 00:52
2004.12.12
Citrix


1-1101475987
Dmitry_04
2004-11-26 16:33
2004.12.12
Що значить $ в оголошенні констант типу integer?


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





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в&#39;єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська