Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
ВнизDelphi типы исключений. Найти похожие ветки
← →
Черный Шаман (2008-01-27 17:41) [0]Как в Delphi узнать, какие исключения могут прийти при вызове данного метода/функции, чтобы в обработчике обрабатывать уже по типу исключения. Неужели только лезть в код?
Связано с веткой
http://delphimaster.net/view/15-1201268375/
← →
Palladin © (2008-01-27 17:42) [1]
> Неужели только лезть в код?
ага, если доступен и в справку, если она доступно и там указано
← →
Игорь Шевченко © (2008-01-27 17:43) [2]
> Как в Delphi узнать, какие исключения могут прийти при вызове
> данного метода/функции, чтобы в обработчике обрабатывать
> уже по типу исключения
Exception и не мучиться
← →
Черный Шаман (2008-01-27 17:49) [3]
> Palladin © (27.01.08 17:42) [1]
>
>
> > Неужели только лезть в код?
>
> ага, если доступен и в справку, если она доступно и там
> указано
Если там прописаны только типы исключений, около 100, то на каждый метод писать простыню
try
catch on E: Exception do
begin
if E is тип исключения then;
if E is тип исключения then;
... и так 100 раз
end;
end;
Тоесть я обрабатываю исключения которые мне нужны, но зачем мне все остальные, если я сейчас не представляю что с ними делать?
← →
Palladin © (2008-01-27 17:51) [4]ну так и ни делай ничего, кто тебя заставляет то? если знаешь как реагировать - реагируй, незнаешь делай Raise выше по уровню либо игнорируй... хотя правильней делать Raise дальше
← →
Семеныч (2008-01-27 17:53) [5]> Черный Шаман (27.01.08 17:49) [3]
Значит, их и не надо обрабатывать. Пусть идут наверх.
← →
Palladin © (2008-01-27 17:53) [6]
> catch on E: Exception do
кстати это в какой Делфи такая конструкция появилась?
← →
Семеныч (2008-01-27 17:55) [7]> Palladin © (27.01.08 17:53) [6]
Это из Jelphi или из Celphi, видимо...
:о)
← →
Черный Шаман (2008-01-27 18:00) [8]
> Palladin © (27.01.08 17:53) [6]
>
>
> > catch on E: Exception do
>
> кстати это в какой Делфи такая конструкция появилась?
Ну в общем слегка проглючило меня. Сейчас и с делфийский и и сишным кодом колупаюсь, вот и вылазят монстры сознания :)
← →
iZEN © (2008-01-27 18:03) [9]
> Palladin © (27.01.08 17:51) [4]
>
> ну так и ни делай ничего, кто тебя заставляет то? если знаешь
> как реагировать - реагируй, незнаешь делай Raise выше по
> уровню либо игнорируй... хотя правильней делать Raise дальше
Чем правильней? Из-за простого эксепшена типа "DevisionByZero" или "EndOfFile", который неизвестно откуда из недр чужого кода (например, не описан нигде, кроме как в исходниках) приходит в наш, и вылетает всё приложение?
Не уследили...
← →
Черный Шаман (2008-01-27 18:04) [10]
> Palladin © (27.01.08 17:51) [4]
>
> ну так и ни делай ничего, кто тебя заставляет то? если знаешь
> как реагировать - реагируй, незнаешь делай Raise выше по
> уровню либо игнорируй... хотя правильней делать Raise дальше
А здесь тонкий момент, нужно ли кидать внутренние исключения, не документированные в описании библиотеки(документации) за ее пределы. Пока все исключения которые не относятся к логической структуре данной библиотеки я давлю, если кидаю, то только свои(которые описаны).
Это удобно для использующего библиотеку, которая еще три сторонние библиотеки может использовать и каждая из них может возбуждать свои исключения.
В принципе, зачем, к примеру, драйверу база данных сообщать наверх о недоступности файла базы. Уму нужно сообщить о невозможности подключится к базе данных, но без всяких заморочек которые будут еще более запутывать пользователя-программиста.
← →
Черный Шаман (2008-01-27 18:06) [11]
> iZEN © (27.01.08 18:03) [9]
>
>
> > Palladin © (27.01.08 17:51) [4]
> >
> > ну так и ни делай ничего, кто тебя заставляет то? если
> знаешь
> > как реагировать - реагируй, незнаешь делай Raise выше
> по
> > уровню либо игнорируй... хотя правильней делать Raise
> дальше
>
> Чем правильней? Из-за простого эксепшена типа "DevisionByZero"
> или "EndOfFile", который неизвестно откуда из недр чужого
> кода (например, не описан нигде, кроме как в исходниках)
> приходит в наш, и вылетает всё приложение?
> Не уследили...
> ketmar © (26.01.08 23:25) [111]
>
> >[110] Черный Шаман (26.01.08 22:27)
> если я пишу программу, то обычно до «верхнего уровня» никто
> не доползает, ибо ловится там, где полагается. а если что-
> то доползло — делается post mortem дамп и всё схлопывается.
> ибо это fatal error.
http://delphimaster.net/view/15-1201268375/
← →
Семеныч (2008-01-27 18:16) [12]> iZEN © (27.01.08 18:03) [9]
> Чем правильней?
Тем, что либо обработается там, где предусмотрено, либо вылезет на самый верх и просигнализирует об ошибке. Если же исключение просто подавить, то программа, скорее всего, работать будет неверно, но знать об этом никто не будет. Такая программа в миллион раз хуже.
> Из-за простого эксепшена типа "DevisionByZero" или "EndOfFile", который
> неизвестно откуда из недр чужого кода
Это распространенное заблуждение. Программе (и юзеру) по барабану, кто автор кода. Как только Вы начали использовать в программе чужой код - он уже не чужой. Это уже код программы. И если из-за него программа вылетает, то это в миллион раз лучше, чем если Вы исключение задавите (см. предыдущий абзац).
← →
Palladin © (2008-01-27 18:17) [13]Это он пошутил... настолько жестко контролировать исключения может только тот - кто не использует ничего стороннего, кроме своего...
← →
Anatoly Podgoretsky © (2008-01-27 18:18) [14]> Черный Шаман (27.01.2008 18:04:10) [10]
О да, именно так и поступают, пишут - не удалось подключиться, а ты как дурак думай к чему и почему.
Верный последователь Вредных заветов и советов.
← →
Anatoly Podgoretsky © (2008-01-27 18:20) [15]> Palladin (27.01.2008 18:17:13) [13]
То есть Дельфи написал с нуля.
← →
DVM © (2008-01-27 18:25) [16]
> Семеныч
> Если же исключение просто подавить, то программа, скорее
> всего, работать будет неверно, но знать об этом никто не
> будет. Такая программа в миллион раз хуже.
Ну конечно. Кому должен сигналить сервер об исключении и останавливаться?
← →
Семеныч (2008-01-27 18:36) [17]> DVM © (27.01.08 18:25) [16]
Здравый смысл говорит о том, что не стоит все понимать буквально. Он же говорит о том, что и сервер надо строить по той же схеме: исключение должно либо обрабатываться там, где известно, как его обрабатывать, либо проходить на самый верх. Но если мы пишем сервер, то на самом верху все необработанные исключения тоже перехватываются и пишутся в лог (поскольку ничего другого все равно не остается).
← →
Anatoly Podgoretsky © (2008-01-27 18:38) [18]> DVM (27.01.2008 18:25:16) [16]
Ты хочешь обсудить "конкретную" программу?
Тогда приводи код и описание работы, с учетом всех неожиданных ситуаций.
← →
DVM © (2008-01-27 18:43) [19]
> Семеныч
> то на самом верху все необработанные исключения тоже перехватываются
> и пишутся в лог
Т.е. все таки они подавляются.
> Anatoly Podgoretsky ©
> Ты хочешь обсудить "конкретную" программу?
Конкретную программу обсуждать здесь только флуд плодить.
← →
Palladin © (2008-01-27 18:44) [20]
> [19] DVM © (27.01.08 18:43)
подавление - не делать ничего, а это, извини меня, немножко отличается от записи в лог (и, в случае возможности, уведомления клиента)
← →
DVM © (2008-01-27 18:47) [21]
> подавление - не делать ничего, а это, извини меня, немножко
> отличается от записи в лог
С этим я согласен. Только вот почему бы просто не записать в лог по месту и там же его подавить, а не гнать исключение "наверх"?
← →
Palladin © (2008-01-27 18:52) [22]ааа, батенька :) вот тот и приходит необходимость определения пресловутого "верх"... исключение нужно гнать наверх настолько насколько это необходимо, если логика приложения требует, то всегда определен свой "верх", отличный от по умолчанию, там то и прописана реакция на все непойманные "ниже" исключения... и конечно после записи в лог его сразу давить нужно... свое предназначение оно выполнило... но нужно осозновать что в лог писать нужно его как раз на том самом "верху"... ведь за ним Москва!
← →
Anatoly Podgoretsky © (2008-01-27 18:53) [23]> DVM (27.01.2008 18:43:19) [19]
Не подавляются, а пишутся в ЛОГ, а это большая разница и такова природа серверов, нельзя давить исключение, оно должно быть как то обработано, что бы не потерялось, и что бы при этом сервер не вылетел по исключению.
← →
DVM © (2008-01-27 18:54) [24]
> Palladin © (27.01.08 18:52) [22]
А, ну да. Вобщем верно.
← →
DVM © (2008-01-27 18:57) [25]
> Anatoly Podgoretsky ©
> Не подавляются, а пишутся в ЛОГ, а это большая разница и
> такова природа серверов, нельзя давить исключение
В моем понимании "давить" это
try
...
except
что-то делаем
end;
Не пустой try...except...end;
← →
Anatoly Podgoretsky © (2008-01-27 19:08) [26]> DVM (27.01.2008 18:57:25) [25]
Это не давить, а что то делать, например: написать в лог и по интервалу послать письмо админу.
← →
Черный Шаман (2008-01-27 19:08) [27]
> Anatoly Podgoretsky © (27.01.08 18:18) [14]
>
> > Черный Шаман (27.01.2008 18:04:10) [10]
>
> О да, именно так и поступают, пишут - не удалось подключиться,
> а ты как дурак думай к чему и почему.
> Верный последователь Вредных заветов и советов.
Ну зачем так. Для того кто разбирается есть лог ошибок, где все исключения даже обрабатываемые туда заносятся. Для обычного пользователя оно(почему не удалось подключится) и не нужно.
← →
DVM © (2008-01-27 19:09) [28]> Anatoly Podgoretsky ©
> Это не давить, а что то делать,
Тогда значит мы о разном говорили.
← →
Черный Шаман (2008-01-27 19:12) [29]
> Anatoly Podgoretsky © (27.01.08 18:38) [18]
>
> > DVM (27.01.2008 18:25:16) [16]
>
> Ты хочешь обсудить "конкретную" программу?
> Тогда приводи код и описание работы, с учетом всех неожиданных
> ситуаций.
Пример, данные с устройства взаимодействующего по TCP/IP ловятся и пишутся в базу. Иногда устройство пропадает из видимости, иногда сервер базы данных то что делать -
1. программе упасть
2. программе упасть вместе с перезагрузкой сервера
3. логировать исключения и пытаться переподключится к базе или устройству до остановки сервиса или появления работоспособности.
← →
Семеныч (2008-01-27 19:12) [30]> DVM © (27.01.08 18:43) [19]
> Т.е. все таки они подавляются.
Нет, они обрабатываются. Запись в лог - это и есть обработка.
> DVM © (27.01.08 18:47) [21]
> почему бы просто не записать в лог по месту и там же его подавить, а не
> гнать исключение "наверх"?
Во-первых, потому что "в месте" мы не знаем, есть ли в более высоколежащих "местах" обработчик данного исключения (особено, когда используем сторонние библиотеки - а мы их используем практически всегда). Если он есть, то писать исключение в лог "по месту" - решение неверное. А на "самом верху" мы точно знаем, что обработчика нет - поэтому смело можем писать в лог.
Во-вторых, потому что если мы начнем писать исключения в лог "по месту", то таких мест будет много (или очень много). А это и лишний код, и риск, что в одном из "мест" запись лога будет по невнимательности не сделана - вот тогда-то серверу и наступит тот самый капец, о котором Вы говорили. А если мы пишем лог на самом высоком уровне, то и лишнего кода нет, и риска что-то забыть тоже нет, и сервер не свалится.
> DVM © (27.01.08 18:57) [25]
> В моем понимании "давить" это
> ... Не пустой try...except...end;
В Вашем -возможно. А в обычном, непустой try-except - это не "давить", а "обрабатывать".
← →
Anatoly Podgoretsky © (2008-01-27 19:13) [31]> DVM (27.01.2008 19:09:28) [28]
Я давить понимаю одназначно
try
...
except
end;
Программа работает без ошибок.
Обработка ошибок
try
...
except
...
end;
И ни в коем случае не срывать подлинную ошибку, заменяя ее своей - Проишла ошибка, обратитесь к программисту.
← →
Черный Шаман (2008-01-27 19:17) [32]
> Anatoly Podgoretsky © (27.01.08 19:08) [26]
>
> > DVM (27.01.2008 18:57:25) [25]
>
> Это не давить, а что то делать, например: написать в лог
> и по интервалу послать письмо админу.
Нет уж, это давить. лог - частный случай исключения показываемого в messagebox.
А обрабатывать, тоесть выполнять код который пытается логическо-физически исправить ситуацию удаётся довольно редко.
← →
Игорь Шевченко © (2008-01-27 19:20) [33]Черный Шаман (27.01.08 19:17) [32]
> А обрабатывать, тоесть выполнять код который пытается логическо-
> физически исправить ситуацию удаётся довольно редко.
Ситуацию нельзя исправить никогда.
← →
Семеныч (2008-01-27 19:21) [34]> Anatoly Podgoretsky © (27.01.08 19:13) [31]
Чтобы не подменять ошибку своей, но и не заморачивать юзеру голову английским языком, я обычно делаю смешанный вариант:
"Произошла ошибка класса " + e.ClassName + ": " + e.Message + ""."#13#10 +
"Обратитесь к тому-то."
← →
Черный Шаман (2008-01-27 19:22) [35]
> Anatoly Podgoretsky © (27.01.08 19:13) [31]
>
> > DVM (27.01.2008 19:09:28) [28]
>
> Я давить понимаю одназначно
> И ни в коем случае не срывать подлинную ошибку, заменяя
> ее своей - Проишла ошибка, обратитесь к программисту.
Я до этого работал в НИИ, так вот там было требование - все ошибки должны быть только на украинском языке, а лог никому был не нужен, даже пришлось убрать. Так что была конструкция
try
except on E:Exception do
MessageBoxA(...Не вдалося запис в базу елемента меню...)
end;
Так что иногда такой код - code standart.
← →
DVM © (2008-01-27 19:25) [36]
> Семеныч (27.01.08 19:21) [34]
Юзер будет глядеть на это сообщение как баран на новые ворота.
← →
Черный Шаман (2008-01-27 19:25) [37]
> Игорь Шевченко © (27.01.08 19:20) [33]
>
> Черный Шаман (27.01.08 19:17) [32]
>
> > А обрабатывать, тоесть выполнять код который пытается
> логическо-
> > физически исправить ситуацию удаётся довольно редко.
>
> Ситуацию нельзя исправить никогда.
Иногда можно - если формат хранилища невосстановимо разрушен, пересоздать его, если данные в реестре некорректны пересоздать их с чистого листа...
← →
Anatoly Podgoretsky © (2008-01-27 19:25) [38]> Черный Шаман (27.01.2008 19:17:32) [32]
Чудна твоя терминология, отличается от общепринятой.
← →
Семеныч (2008-01-27 19:27) [39]> Игорь Шевченко © (27.01.08 19:20) [33]
Юзер ввел в Edit заведомо неверные данные и жмякнул ОК. Программа обнаружила его ошибку и вместо того, чтобы принять данные и закрыть диалог ввода, выдала ему вразумительное сообщение и попросила либо исправить данные, либо нажать "отмену".
Данные программа не исправила, она этого и не могла сделать. А ситуацию - исправила. И совершенно спокойно может продолжать работать.
← →
DVM © (2008-01-27 19:30) [40]Нормально, написанная программа, имхо, должна сама пытаться устранить проблему, а не сыпать разными сообщениями на каждый нестандартный чих пользователя.
Выдача различных MessageBox - это плохой вариант. Лучше посвечивать место ошибки (Edit) и делать подпись рядом с ним. Юзеры адекватнее реагируют.
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.06 c