
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.188] |
![]() |
|
Сообщ.
#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 раза - вовсе бессмысленно. Ко всему прочему, есть компоненты, которые сами обрабатывают исключения (и и гасят их как нужно). |
Сообщ.
#16
,
|
|
|
Цитата Демо @ Это как - два раза одно исключение? Получать же при отладке одно и то же исключение 2 раза - вовсе бессмысленно. |
Сообщ.
#17
,
|
|
|
Цитата Alexander N @ Каким образом? Таким, что в винде единый супернавороченный механизм обработки исключений, как хардварных (типа деления на 0 или AV), так и любых пользовательских, генерируемых через RaiseException. Тут тебе и повышение приоритета обработки исключения, и сохранение\восстановление нихилых структур данных типа контекста потока и "уйма" процессороного времени - порядка нескольких тысяч тактов при отсутствии отладчика и несколько сотен тысяч тактов при наличии отладчика (даже если он не реагирует на исключение, а просто уведомляется системой). И все это вместо того, чтобы просто "втихую" проверить if Handle < 0 then ... за пару тактов процессора ?! |
Сообщ.
#18
,
|
|
|
Цитата Alexander N @ Это как - два раза одно исключение? Сначала Delphi перехватывает исключение и показывает сообщение с ошибкой пользователю, затем вновь поднимает это же исключение в выполняющейся программе. Т.е. этап обработки исключения самим Delphi - совершенно лишний. |
Сообщ.
#19
,
|
|
|
Цитата Демо @ Сначала Delphi перехватывает исключение и показывает сообщение с ошибкой пользователю, затем вновь поднимает это же исключение в выполняющейся программе. Т.е. этап обработки исключения самим Delphi - совершенно лишний Это неверная интерпретация, т.к. отладчик никакие исключения (кроме своих брикпойнтов) не обрабатывает и ничего вновь не "поднимает", а просто выводит сообщение\предупреждение о возникшем исключении и дает возможность юзеру продолжить обработку либо в пошаговом режиме с заходом в except\finally, или просто продолжить\проскочить все по F9 |
Сообщ.
#20
,
|
|
|
Согласен, неверно выразился.
|
Сообщ.
#21
,
|
|
|
В догонку: все же отключать останов на всех исключениях, это "не есть гуд". Но если есть компоненты или просто часть кода, которая "грешит" тем, что часто\непрерывно генерит эксепшены определенного типа, то можно добавить этот тип эксепшена в список Exception Types to Ignore и соотв-но игнорить не все исключения, а лишь определенные. В частности в примере Alexander N можно было бы добавить в список EFOpenError, чтобы не надоедали ошибки открытия файлов
|
Сообщ.
#22
,
|
|
|
leo, по поводу класса TFileStream и THandleStream Ваша взяла
![]() |
Сообщ.
#23
,
|
|
|
Цитата leo @ И все это вместо того, чтобы просто "втихую" проверить if Handle < 0 then ... за пару тактов процессора ?! Ну скажем не просто "не проверить". А дать возможность написать только код для нормального случая. Не засоряя его всеми этими проверками. А что будет, если файл не найден? А что будет, если он пустой? (я, надеюсь, ReadBeffer используется?) А что будет, если формат данных неверен? |