Вопрос к знатокам harbour.
Как завершить спецфункцию из глубоко вложенной в нее процедуры, если в
той произошла ошибка, которая делает дальнейшее выполнение
невозможным?
Обычные варианты:
* Цепочка проверок кодов возврата процедур. Проблемы: лишний код,
возможный конфликт возвращаемого значения и кода ошибки.
* exit() или аналог, который завершит процесс. Пробовал QUIT, но
завершается весь модуль.
* Выброс исключения внизу с перехватом наверху. Выбрал этот вариант,
но возникла следующая проблема.
Я так понял, что в harbour в блоке try...catch нельзя отловить только
конкретные исключения, а остальные пропустить наверх. Если исключение
не то, что мне нужно, я делаю повторный throw. Проблема в том, что
traceback, который отобразит стандартный обработчик ошибок в этом
случае, будет указывать на место повторного выброса, а не на исходное
место ошибки.
Примерный код спецфункции:
Несколько Вопрос ов:
1. Может, все-таки можно как-то перехватить одно исключение, но
пропустить другое без повторного выброса (как это делается в C++, Java
и проч.)?
2. Как стандартный обработчик выводит traceback? Можно ли этим
функционалом воспользоваться?
3. Есть еще способы завершить программу из глубины?
Как завершить спецфункцию из глубоко вложенной в нее процедуры, если в
той произошла ошибка, которая делает дальнейшее выполнение
невозможным?
Обычные варианты:
* Цепочка проверок кодов возврата процедур. Проблемы: лишний код,
возможный конфликт возвращаемого значения и кода ошибки.
* exit() или аналог, который завершит процесс. Пробовал QUIT, но
завершается весь модуль.
* Выброс исключения внизу с перехватом наверху. Выбрал этот вариант,
но возникла следующая проблема.
Я так понял, что в harbour в блоке try...catch нельзя отловить только
конкретные исключения, а остальные пропустить наверх. Если исключение
не то, что мне нужно, я делаю повторный throw. Проблема в том, что
traceback, который отобразит стандартный обработчик ошибок в этом
случае, будет указывать на место повторного выброса, а не на исходное
место ошибки.
Примерный код спецфункции:
Код |
---|
local err try // основная процедура, которая вызывает много других; некоторые из них // могут привести к завершению программы (например, не удалось // прочитать файл, создать папку и т.п.) main() catch err // не делать throw в catch, чтобы избежать проблем со // стандартным обработчиком (он почему-то не отрабатывает) end if isstring(err) // это мои ошибки (просто строки), выдать сообщение пользователю errormsg(err) elseif err != nil // а это системные, их нужно пропустить дальше throw err // на эту строку укажет traceback в системном диалоге об ошибке end |
Несколько Вопрос ов:
1. Может, все-таки можно как-то перехватить одно исключение, но
пропустить другое без повторного выброса (как это делается в C++, Java
и проч.)?
2. Как стандартный обработчик выводит traceback? Можно ли этим
функционалом воспользоваться?
3. Есть еще способы завершить программу из глубины?