Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Вниз

Использование try finally и try except   Найти похожие ветки 

 
closer   (2003-11-28 20:42) [0]

Будут ли коректно работать конструкции try finally и try except если отключен модуль SysUtils в котором описаны классы исключений.

P.S.
Программа представляет из себя один dpr, без форм, т.к. необходим минимальный размер exe. А подключение SysUtils даёт значительный прирост "веса" exe.


 
Юрий Зотов   (2003-11-28 20:44) [1]

Будут. Отключение SysUtils не отменяет самих исключений.


 
Anatoly Podgoretsky   (2003-11-28 20:45) [2]

А проверить?


 
closer   (2003-11-28 21:11) [3]

> А проверить?
Я себе не доверяю. :)

Насамом деле я не очень хорошо представляю каким образом работает этот механизм в Delphi или С++ (есть ли разница в его реализации на этих языках?).

Может кто-нибуть сможет помочь Internet-ресурсами по этому вопросу?


 
Anatoly Podgoretsky   (2003-11-28 21:17) [4]

Зря это лучше чем доверять словам, могут быть ошибки, а написать несколько строк и убедиться много полезнее.


 
Юрий Зотов   (2003-11-28 21:23) [5]

> closer © (28.11.03 21:11) [3]

Это механизм не столько языков, сколько самой системы (SEH - Structured Exception Handling). Описан в MSDN.


 
Palladin   (2003-11-28 21:25) [6]

Механизм чего? Исключений или же нюансов подключения модулей?
Исключения - весчь системная и "raise", Exception и классы ExceptClass лишь оболочки/утилиты облегчающие обработку и вызов исключений в контексте Object Pascal.
Модули, единожды подключеные, включаются во всю программу.
Повторное указание в каком либо модуле например SysUtils просто открывает область видимости объектов, идентификаторов и типов, указанных в секции interface у SysUtils.

Например

Unit SubUnit1;
interface
uses
classes;

var
SL:TStringList;
implementation
...
end.

Unit MainUnit;
interface
uses
SubUnit1;
implementation

здесь доступен SL и все его методы, ибо компилятор знает что есть TStringList, но он (TStringList) не объявлен в области видимости у модуля MainUnit

Это я к тому, что тоже самое происходит когда подключается какой либо модуль в котором происходит вызов какого либо исключения. Ты можешь указывать SysUtils в своем модуле, можешь не указывать, но подключенный модуль все равно вызовет исключение (если конечно повод будет).


 
vuk   (2003-11-28 21:30) [7]

to Юрий Зотов:
Не соглашусь. Сам по себе try/except - именно языковой механизм и на SEH никак не завязан. Отключение же модуля SysUtils приведет к тому, что не будет возникать стандартных исключений.


 
Юрий Зотов   (2003-11-28 22:06) [8]

> vuk

program Project1;
{$APPTYPE CONSOLE }
var
A: word = 0;
begin
try
A := 1 div A;
finally
WriteLn("finally");
end
end.


Проходим отладчиком - writeln вызывается. Потом убираем try и еще раз проходим отладчиком - writeln не вызывается. Значит, в отношении finally Вы не правы.

ОК, теперь менеям finally на except и видим, что wrileln не вызывается. Добавляем SysUtils - вызывается. Значит, в отношении except Вы правы. Ответ, повидимому, надо искать где-то в недрах SysUtils.Initialization.


 
Vuk   (2003-11-28 22:14) [9]

to Юрий Зотов:
>Значит, в отношении finally Вы не правы.
Хде я не прав? finally будет вызываться, что называется, по любому - было исключение или его не было. Что и наблюдается.


 
Юрий Зотов   (2003-11-28 22:21) [10]

> Vuk © (28.11.03 22:14) [9]
> finally будет вызываться, что называется, по любому - было
> исключение или его не было
В том то и дело - вызывается, даже если было. То есть, обработка исключений все-таки работает. Заход в finally при возникновении исключения - разве это не есть ТОЖЕ обработка исключения?


 
vuk   (2003-11-28 22:52) [11]

Ну да. Только дело не в SysUtils, а в system и startup коде RTL.


 
Бином Ньютоныч   (2003-11-28 23:32) [12]

>vuk © (28.11.03 21:30) [7]
>Не соглашусь. Сам по себе try/except - именно языковой механизм и на SEH никак не завязан. Отключение же модуля SysUtils приведет к тому, что не будет возникать стандартных исключений.

Как же не завязан? Пишем try - компилятор загоняет в стек точку перехода на "общий" обработчик исключений, а вершину стека сохраняет в TLS. Будет исключение - на него и перейдет обработка, что и обеспечивает SEH. И этот "общий" обработчик проверяет, указаны ли "частные" обработчики ошибок. И если нет, что и происходит без Sysutils или если свои не укажешь, то возвращается 1 и система валит процесс. Вроде примерно так, а?


 
closer   (2003-11-30 00:47) [13]

Кто-нибудь хочет что то-нибудь добавить?

P.S.
Если "нет" я подведу итог.


 
марсианин   (2003-11-30 03:52) [14]

try-finally без СисУтилс работать будет -100%
а в случае try-except

try
X := Y/Z;
except
on EZeroDivide do .......;
end;

так вот оно бы работало, если бы после не требовалось поставить EZeroDivide или что-то еще.. вот было бы как в Сях exception по коду вылавливать.. может и здесь так можно? без всяких классов.. я не в курсе..


 
марсианин   (2003-11-30 04:20) [15]

забираю свои слова обратно:
если закомментировать SysUtils, этот код ведет себя совсем по-другому (у меня Делфи 5)


program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;

var x,y,z:Single;
begin
x := 0; y := 1; z := 0;
try
try
x := y/z;
except
on TObject do // Exception
begin
writeln("error");
MessageBeep(DWORD(-1));
end;
end;//*)
finally
writeln("finally x=",x);
ReadLn;
end;
end.


 
Nikolay M.   (2003-11-30 11:41) [16]

В продолжение темы.

> Юрий Зотов © (28.11.03 22:21) [10]
> vuk © (28.11.03 22:52) [11]
> Бином Ньютоныч (28.11.03 23:32) [12]

С месяц назад тоже озаботился этим вопросом - каким образом реализованы обработчики исключений и можно ли в Дельфи (или в любой другой среде) обойтись без try..except или аналогов. Но в MSDN все, что касается SEH, крутится вокруг __try и __catch. Неужели, если хотим избавиться от try..except, нужно руками реализовывать [12]?


 
Бином Ньютоныч   (2003-11-30 14:52) [17]

>Nikolay M. © (30.11.03 11:41) [16]
> Неужели, если хотим избавиться от try..except, нужно руками реализовывать [12]?

Канэчна, дарагой:) От SEH приходит флаг исключения в структуре PExceptionRecord, который нужно разруливать, иного не дано. Не, если делать чисто raise EMyException.create..., где EMyException = class(TObject), то достаточно указать ExceptProc в System, но при этом системные исключения типа деления на ноль и т.п. завалят прогу. А вообще-то здесь смысл чиста познавательный. Ну делал я, сэкономил кил 20-30... оно надо?


 
closer   (2003-12-01 05:48) [18]

Подведу итог (поправте если я где-то ошибся):
1. Конструкцию try finally можно использовать не подключая модуль SysUtils.
2. Конструкция try except корректно работает только при подключении модуля SysUtils. Это связано с тем, что в этом модуле объявлены процедуры которые выполняются при возникновении исключений (выводят окошки с ошибками, вызывают классы исключений).


 
Nikolay M.   (2003-12-01 09:36) [19]


> Бином Ньютоныч (30.11.03 14:52) [17]

Смысл не совсем познавательный. Возникла трабла с VB 6.0: у мальчика периодически отваливался ексель, с которым он работал через ОЛЕ, отследить это он не мог и при попытке произвести после этого с екселем какое-то действие вся программа вываливалась с ошибкой, которую ON ERROR GOTO не отлавливал, а try except появились только в VB.Net.
Вот я и озадачился вопросом, как в принципе обойтись без try except.


 
Бином Ньютоныч   (2003-12-01 18:39) [20]

>Nikolay M. © (01.12.03 09:36) [19]

Ну VB тут мимо темы потому как работать придется на асме. Если под ХР попробуй использовать векторные обработчики. Смотри AddVectoredExceptionHandler. Тока я те тут не помошник, не пробовал этого зверя.


 
vuk   (2003-12-01 19:04) [21]

Может обойтись без VB? :o) В свое время меня падучесть Excel заставила писать генератор xls файлов без участия Excel.


 
Nikolay M.   (2003-12-01 20:00) [22]


> Бином Ньютоныч (01.12.03 18:39) [20]

Насчет VB не в курсе - а что, там асм-вставок нет? :(
AddVectoredExceptionHandler - знаю, тоже был в мсдн... :?)


> vuk © (01.12.03 19:04) [21]

Знаю, помню, Вы мне даже этот генератор по почте выслали как раз под ту задачу, на которую мы мальчика на VB взяли (года 3 назад) :)
А падучесть VB+Excel - ничто по сравнению с глюкавостью Delphi+Excel, поэтому и брали нового человека. Поскольку нужно было не столько генерить файлы, сколько их читать и разбирать... Но все равно спасибо еще раз :?)


 
vuk   (2003-12-01 20:19) [23]

to Nikolay M.:
>Поскольку нужно было не столько генерить файлы, сколько их
>читать и разбирать...
Тогда да, здесь уже никак. Либо через OLE либо опять же строить свой анализатор, что гораздо сложнее генератора. Задачу разбора xls тоже решал. У меня сделан разбор XLS на vb-скриптах, которые используются через Delphi. Но это сделано только из-за того, чтобы не перестраивать программу при изменении внутренней логики разбираемых файлов.


 
Nikolay M.   (2003-12-01 20:50) [24]


> vuk © (01.12.03 20:19) [23]

Вот-вот. Мы через VB в итоге тоже сделали.
Btw, вы у нас в клиентах ходите ;)
http://www.pricematrix.ru/index.php3?mod=5&letter=Ф&lpos=51


 
марсианин   (2003-12-01 23:09) [25]

2 closer © (01.12.03 05:48) [18]

тот код, что я привел ведет себя крайне странно.. заметь он компилируется без SysUtils.

но если его отключить и запустить прогу из-под Делфи нажатием Ф9. то мало того что исключение не обработается, отладчик ввобще его не заметит (окошко, что мол произошло EZeroDivide, не покажется, выполнение кода не остановится на строчке с делением).. что наверное неудивительно, так как EZeroDivide - необьявлен ведь...

Похоже, тут дело не просто в видимости классов исключений, а в самом методе как делфи их обрабатывает.. через создание этих самых классов исключений...а тут СисУтилс жизненно необходим..

неужели по-другому никак?

вообщем ты наверное прав..разве что окошки с ошибками показывать - это дело Делфи (в смысле среды) и Виндоус (мол неустранимая ошибка и тп)..



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
9-36496
Intell
2003-05-21 17:44
2003.12.12
Кто-нибудь умеет читать файлы от GameMaker`а?


1-36763
Слэш
2003-12-01 11:53
2003.12.12
GetFileVersionInfoSize и сетевое имя файла


14-36818
RealRascal
2003-11-19 22:26
2003.12.12
Москва, сравним цены?


1-36747
Urvin
2003-12-01 18:10
2003.12.12
Свой Курсор


14-36807
Gorlum
2003-11-20 11:01
2003.12.12
Сканирование





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