Возврат ошибки из функции

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Возврат ошибки из функции

Сообщение krab »

Как принято возвращать код ошибки из функции в приложениях Lazarus (функция NonexistentStandardLazarusSetErrorCode(var code: LazErrorType))?

P. S. Конечно, можно изобрести свой способ, но нет ли готового, общепринятого?
Последний раз редактировалось krab 30.07.2010 20:39:32, всего редактировалось 2 раза.
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

MageSlayer писал(а):Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.

У каждой функции свой, особый, список кодов возврата, единого типа TError=(erErrorOne, erErrorGreat, erErrorAwful) нет?
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

krab писал(а):
MageSlayer писал(а):Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.

У каждой функции свой, особый, список кодов возврата, единого типа TError=(erErrorOne, erErrorGreat, erErrorAwful) нет?


Ну, да. Откуда ж взяться единому?
У каждом приложении своя логика.
Или вы имеете в виду какой-то типичный случай типа логгера?
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Если функция находится в том же приложении (т.е. не в динамической библиотеке), я предпочитаю использовать

Код: Выделить всё

raise Exception.Create('Error message');
Код возврата можно забыть проверить, плюс постоянные проверки загромождают код. А с исключениями получается компактнее и надёжнее.
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

Odyssey писал(а):Если функция находится в том же приложении (т.е. не в динамической библиотеке), я предпочитаю использовать

Код: Выделить всё

raise Exception.Create('Error message');

Exception.Destroy при обработке исключения выполнит сам Lazarus или нужно делать самостоятельно при обработке исключения в try..except..?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Все Эксцепшенны Lazarus уничтожит сам. Если конечно созданы при помощи конструкции raise.

Добавлено спустя 42 секунды:
Вернее не Lazarus, а RTL.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

2krab:
За действия с исключениями полностью отвечает среда. Как в delphi, так и в lazarus.

Вот только есть вопрос.

А так ли нужны эксцепшены?
У меня почему-то такая привычка, обрабатывать их в функциях и возвращать результат.
Кажется, они только мешают. Может, лучше без них?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

у мну тоже такая привычка, т.к. легче контролировать.
но с другой стороны try - except блоки позволяют ещё лучше контролировать, так что, наверное, я не прав
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?
Приходится оборачивать пустыми try/except.
Ведь, по-идее, это же неправильно? Как, вообще, люди с исключениями работают?
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

А.Н. писал(а):А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?
Приходится оборачивать пустыми try/except.


Хм. Непонятно, какое отношение циклы имеют к исключениям?
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

A.H писал(а):А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?

Код: Выделить всё

while Condition do
begin
  try
    // ...
  except
    on E: YourException do
    begin
       // обработка
    end;
  end;
end;

Все хорошо обрабатывается.
А.Н. писал(а):Приходится оборачивать пустыми try/except.

Это очень плохая практика. Если возникнет ошибка (например, в виде исключения от компонента), вы об этом не узнаете и программа будет продолжать работать неправильно.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Зато, если выкинет в середине цикла, который должен обработать все элементы (и после него ещё должна быть обработка), программа вообще никак не будет работать. Зависнет, например. А так, элемент будет пропущен и обработка продолжится. К тому же, если исключения выбрасываются библиотекой, что мне искать все классы исключений, которые она может выбросить? Но я не спорю - это действительно неправильно. Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?

Добавлено спустя 1 минуту 53 секунды:
2MageSlayer:
Такое же, как и всё остальное. Один из случаев, когда я не понимаю, как с ними правильно работать.
Ещё, например, меня интересует тонна проверок на nil. Ведь, по-идее, в коде не должно быть таких проверок?
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

А.Н. писал(а):Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?

В Java, кроме обычных, есть проверяемые исключения, когда в описании функции указывается список исключений, которые она может бросать. Компилятор требует, чтобы при ее вызове все они обрабатывались. Только почему-то этот подход не пользуется популярностью в других языках.
Последний раз редактировалось krab 01.08.2010 22:40:45, всего редактировалось 1 раз.
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

А.Н. писал(а):Зато, если выкинет в середине цикла, который должен обработать все элементы (и после него ещё должна быть обработка), программа вообще никак не будет работать. Зависнет, например. А так, элемент будет пропущен и обработка продолжится. К тому же, если исключения выбрасываются библиотекой, что мне искать все классы исключений, которые она может выбросить? Но я не спорю - это действительно неправильно. Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?

Добавлено спустя 1 минуту 53 секунды:
2MageSlayer:
Такое же, как и всё остальное. Один из случаев, когда я не понимаю, как с ними правильно работать.
Ещё, например, меня интересует тонна проверок на nil. Ведь, по-идее, в коде не должно быть таких проверок?


Опять неясно.
Если вы имеете в виду какие-то побочные эффекты в циклах, то надо оборачивать try/except и в except вставлять raise для дальнешего разкручивания стека.

Про тонну проверок опять не понял. Может все-таки по-подробнее?
Ответить