
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.147] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
юзаю try except... запускаю прогу в компиляторе - всеравно выдает ошибку
компилирую и запускаю сам ексешник - ошибок нет,все норм. Собственно как отключить эту штуку в компиляторе что бы спокойно можно было из компилятора запускать?? подскажите плиз |
Сообщ.
#2
,
|
|
|
Tools/Options/Debugger/Stop on exceptions.
|
Сообщ.
#3
,
|
|
|
Цитата 8ka @ Собственно как отключить эту штуку в компиляторе что бы спокойно можно было из компилятора запускать?? подскажите плиз Не надо это делать! Тем самым вы сами себе "серпом по фабержам"! Спокойно "запускать" под встроенном отладчиком (а не "из компилятора", как вы сказали) вам ничего не мешает. Он (отладчик) вам только всегда напоминает об ошибках. И только если вы уверены на 100%, что вы "грамотно" обработали все ошибки, вы можете выключить опцию "Stop on exceptions". Хотя я не понимаю для чего это нужно! |
Сообщ.
#4
,
|
|
|
Цитата northener @ Было нужно. Поиск файлов-дубликатов на диске - здесь я обрабатываю неудачное открытие файла одним оператором continue, но таких файлов много, поэтому было напряжно каждый раз закрывать окошко ошибки. Хотя я не понимаю для чего это нужно! |
Сообщ.
#5
,
|
|
|
Цитата Alexander N @ Было нужно. Поиск файлов-дубликатов на диске - здесь я обрабатываю неудачное открытие файла одним оператором continue, но таких файлов много Если "таких файлов много", то это уже не исключительная ситуация, а вполне штатная, поэтому логичнее было бы просто (локально) отключить генерацию исключений при открытии файлов по {$I-} и проверять успешность по IOResult |
Сообщ.
#6
,
|
|
|
Цитата leo @ Как? Я же через TFileStream работал? Если "таких файлов много", то это уже не исключительная ситуация, а вполне штатная, поэтому логичнее было бы просто (локально) отключить генерацию исключений при открытии файлов по {$I-} и проверять успешность по IOResult |
Сообщ.
#7
,
|
|
|
Цитата Alexander N @ Как? Я же через TFileStream работал? Еще лучше - значит нужно было работать через THandleStream + FileOpen\FileClose без всяких IOResult ![]() По любому, как ни крути, а исключение должно быть не правилом, а исключением из правил ![]() |
Сообщ.
#8
,
|
|
|
Цитата leo @ А как позицию хранить? Блоками читать? Еще лучше - значит нужно было работать через THandleStream + FileOpen\FileClose без всяких IOResult |
Сообщ.
#9
,
|
|
|
Цитата Alexander N @ А как позицию хранить? Блоками читать? О чем это ты ? TFileStream это совершенно куций фантик для THandleStream, и делает он всего две элементарные вещи: 1) в конструкторе вызывает inherited Create(FileOpen(FileName, Mode)) + проверяет хэндл файла и генерит исключение при FHandle < 0 2) в деструкторе закрывает файл по if FHandle >= 0 then FileClose(FHandle); Спрашивается, что изменится, если открытие и закрытие файла вынести наружу и юзать THandleStream в "чистом виде" ? Добавлено ![]() ![]() var h:integer; strm:THandleStream; begin ... h:=FileOpen(FName,Mode); if h >= 0 then begin strm:=THandleStream.Create(h); try ... finally strm.Free; FileClose(h); end; end else ... //ошибка открытия файла GetLastError end; |
Сообщ.
#10
,
|
|
|
А у меня массив из TFileStream - как его заменить?
Добавлено Переменной длины |
Сообщ.
#11
,
|
|
|
Цитата Alexander N @ А у меня массив из TFileStream - как его заменить? Час от часу не легче ![]() Ну определи тогда свой класс, который будет закрывать файл в деструкторе ![]() ![]() type TMyFileStream = class(THandleStream) destructor Destroy;override; end; destructor TMyFileStream.Destroy; begin if Handle >= 0 then FileClose(Handle); inherited; end; var files:array of TMyFileStream; h:integer; begin ... h:=FileOpen(FName,Mode); if h >= 0 then begin SetLength(files,Length(files)+1); files[Length(files)-1]:=TMyFileStream.Create(h); ... end else ... //GetLastError end; |
Сообщ.
#12
,
|
|
|
Цитата leo @ Ну а зачем, если уже есть TFileStream и его хватает с лихвой? Ну определи тогда свой класс, который будет закрывать файл в деструкторе ![]() |
Сообщ.
#13
,
|
|
|
Цитата Alexander N @ Ну а зачем, если уже есть TFileStream и его хватает с лихвой? Ага с очень большой лихвой, упомянутой тобой в #4 ![]() Реализация TFileStream предполагает, что ошибка открытия файла, это маловероятная = исключительная ситуация, поэтому "безобидно"\"безболезненную" проверку на Handle < 0 превращает в исключительную raise EFOpenError, "ставя на уши" не только саму прогу, но и всю систему в целом - не зря же отладчик "вопит" при каждом исключении ![]() |
Сообщ.
#14
,
|
|
|
Цитата leo @ Каким образом? но и всю систему в целом |
Сообщ.
#15
,
|
|
|
Установка флага Tools/Options/Debugger/Stop on Delphi exceptions в "on" нужна в очень редких случаях (таких даже не припомню).
Используется только для отладки. Обработка исключений - необходимая и нормальная вещь внутри программы. Получать же при отладке одно и то же исключение 2 раза - вовсе бессмысленно. Ко всему прочему, есть компоненты, которые сами обрабатывают исключения (и и гасят их как нужно). |