Возврат ошибки из функции
Модератор: Модераторы
Возврат ошибки из функции
Как принято возвращать код ошибки из функции в приложениях Lazarus (функция NonexistentStandardLazarusSetErrorCode(var code: LazErrorType))?
P. S. Конечно, можно изобрести свой способ, но нет ли готового, общепринятого?
P. S. Конечно, можно изобрести свой способ, но нет ли готового, общепринятого?
Последний раз редактировалось krab 30.07.2010 20:39:32, всего редактировалось 2 раза.
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.
MageSlayer писал(а):Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.
У каждой функции свой, особый, список кодов возврата, единого типа TError=(erErrorOne, erErrorGreat, erErrorAwful) нет?
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
krab писал(а):MageSlayer писал(а):Э-э.
Стандартный?
Ну, исключения, или просто код возврата. Лишние глобальные переменные, имхо, никчему.
У каждой функции свой, особый, список кодов возврата, единого типа TError=(erErrorOne, erErrorGreat, erErrorAwful) нет?
Ну, да. Откуда ж взяться единому?
У каждом приложении своя логика.
Или вы имеете в виду какой-то типичный случай типа логгера?
Если функция находится в том же приложении (т.е. не в динамической библиотеке), я предпочитаю использовать
Код возврата можно забыть проверить, плюс постоянные проверки загромождают код. А с исключениями получается компактнее и надёжнее.
Код: Выделить всё
raise Exception.Create('Error message');Odyssey писал(а):Если функция находится в том же приложении (т.е. не в динамической библиотеке), я предпочитаю использоватьКод: Выделить всё
raise Exception.Create('Error message');
Exception.Destroy при обработке исключения выполнит сам Lazarus или нужно делать самостоятельно при обработке исключения в try..except..?
Все Эксцепшенны Lazarus уничтожит сам. Если конечно созданы при помощи конструкции raise.
Добавлено спустя 42 секунды:
Вернее не Lazarus, а RTL.
Добавлено спустя 42 секунды:
Вернее не Lazarus, а RTL.
2krab:
За действия с исключениями полностью отвечает среда. Как в delphi, так и в lazarus.
Вот только есть вопрос.
А так ли нужны эксцепшены?
У меня почему-то такая привычка, обрабатывать их в функциях и возвращать результат.
Кажется, они только мешают. Может, лучше без них?
За действия с исключениями полностью отвечает среда. Как в delphi, так и в lazarus.
Вот только есть вопрос.
А так ли нужны эксцепшены?
У меня почему-то такая привычка, обрабатывать их в функциях и возвращать результат.
Кажется, они только мешают. Может, лучше без них?
у мну тоже такая привычка, т.к. легче контролировать.
но с другой стороны try - except блоки позволяют ещё лучше контролировать, так что, наверное, я не прав
но с другой стороны try - except блоки позволяют ещё лучше контролировать, так что, наверное, я не прав
А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?
Приходится оборачивать пустыми try/except.
Ведь, по-идее, это же неправильно? Как, вообще, люди с исключениями работают?
Приходится оборачивать пустыми try/except.
Ведь, по-идее, это же неправильно? Как, вообще, люди с исключениями работают?
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
А.Н. писал(а):А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?
Приходится оборачивать пустыми try/except.
Хм. Непонятно, какое отношение циклы имеют к исключениям?
A.H писал(а):А как быть в случае, когда исключение выбрасывается в середине цикла, и наступает пиз...^Wхорошо?
Код: Выделить всё
while Condition do
begin
try
// ...
except
on E: YourException do
begin
// обработка
end;
end;
end;Все хорошо обрабатывается.
А.Н. писал(а):Приходится оборачивать пустыми try/except.
Это очень плохая практика. Если возникнет ошибка (например, в виде исключения от компонента), вы об этом не узнаете и программа будет продолжать работать неправильно.
Зато, если выкинет в середине цикла, который должен обработать все элементы (и после него ещё должна быть обработка), программа вообще никак не будет работать. Зависнет, например. А так, элемент будет пропущен и обработка продолжится. К тому же, если исключения выбрасываются библиотекой, что мне искать все классы исключений, которые она может выбросить? Но я не спорю - это действительно неправильно. Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?
Добавлено спустя 1 минуту 53 секунды:
2MageSlayer:
Такое же, как и всё остальное. Один из случаев, когда я не понимаю, как с ними правильно работать.
Ещё, например, меня интересует тонна проверок на nil. Ведь, по-идее, в коде не должно быть таких проверок?
Добавлено спустя 1 минуту 53 секунды:
2MageSlayer:
Такое же, как и всё остальное. Один из случаев, когда я не понимаю, как с ними правильно работать.
Ещё, например, меня интересует тонна проверок на nil. Ведь, по-идее, в коде не должно быть таких проверок?
А.Н. писал(а):Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?
В Java, кроме обычных, есть проверяемые исключения, когда в описании функции указывается список исключений, которые она может бросать. Компилятор требует, чтобы при ее вызове все они обрабатывались. Только почему-то этот подход не пользуется популярностью в других языках.
Последний раз редактировалось krab 01.08.2010 22:40:45, всего редактировалось 1 раз.
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
А.Н. писал(а):Зато, если выкинет в середине цикла, который должен обработать все элементы (и после него ещё должна быть обработка), программа вообще никак не будет работать. Зависнет, например. А так, элемент будет пропущен и обработка продолжится. К тому же, если исключения выбрасываются библиотекой, что мне искать все классы исключений, которые она может выбросить? Но я не спорю - это действительно неправильно. Вопрос в том как с ними работать по-человечески? Или, exceptions - это, из серии "гладко было на бумаге, да забыли про овраги"?
Добавлено спустя 1 минуту 53 секунды:
2MageSlayer:
Такое же, как и всё остальное. Один из случаев, когда я не понимаю, как с ними правильно работать.
Ещё, например, меня интересует тонна проверок на nil. Ведь, по-идее, в коде не должно быть таких проверок?
Опять неясно.
Если вы имеете в виду какие-то побочные эффекты в циклах, то надо оборачивать try/except и в except вставлять raise для дальнешего разкручивания стека.
Про тонну проверок опять не понял. Может все-таки по-подробнее?
