Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1201196240
Lip
2008-01-24 20:37
2008.03.02
Как называется алгоритм сортировка?


15-1201686214
andreoman
2008-01-30 12:43
2008.03.02
Microsoft Word 9.0 что за версия ?


15-1201424349
Kostafey
2008-01-27 11:59
2008.03.02
С днем рождения ! 26 января


15-1201689902
oldman
2008-01-30 13:45
2008.03.02
А вы в это верите? (оффтоп, конечно, но...)


3-1192099082
9899100
2007-10-11 14:38
2008.03.02
запрос ? :(





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