Головна сторінка
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
Та ні чому ж, я на Dial-up і дуже рідко і не на довго виходжу тому ці 6мб у мене досих пір в закачуванні висять :(

>> Digitman
а шкода ... буду докачувати сьогодні JCL Releases і пробувати, я дивлюся класний наборчик%)



сторінки: 1 вся гілка

Форум: "Основна";
Поточний архів: 2004.12.12;
Завантажити: [xml.tar.bz2];

Вгору





Пам'ять: 0.69 MB
Час: 0.072 c
3-1100514222
alsov1
2004-11-15 13:23
2004.12.12
Проблема з поверненням параметра в TADOStoredProc


14-1100858389
BorisUK
2004-11-19 12:59
2004.12.12
Завдання


1-1101646595
Vitiy
2004-11-28 15:56
2004.12.12
Глюк з перевантаженими операторами !!!


14-1100885645
wolf1979
2004-11-19 20:34
2004.12.12
Транслятор / інтерпретатор Java


3-1100504182
wHammer
2004-11-15 10:36
2004.12.12
Чи можливе відновлення?





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