BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Как завершить спецфункцию из глубины?

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Как завершить спецфункцию из глубины?
 
Вопрос к знатокам harbour.

Как завершить спецфункцию из глубоко вложенной в нее процедуры, если в
той произошла ошибка, которая делает дальнейшее выполнение
невозможным?

Обычные варианты:

* Цепочка проверок кодов возврата процедур. Проблемы: лишний код,
возможный конфликт возвращаемого значения и кода ошибки.

* 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. Есть еще способы завершить программу из глубины?
 
Не совсем понял, почему тема продублировалась. Извиняюсь за неудобство.
Страницы: 1
Читают тему (гостей: 1)