Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.024 c
15-1201506814
toto
2008-01-28 10:53
2008.03.02
ASP3


2-1202134325
alexsashkan
2008-02-04 17:12
2008.03.02
Проблема с выборкой из базы


3-1192156062
MIG
2007-10-12 06:27
2008.03.02
Редактируемые запросы


2-1201861596
Silver...
2008-02-01 13:26
2008.03.02
как прочесть фаил такой структуры


15-1201268736
sauron
2008-01-25 16:45
2008.03.02
Наконец-то....