Как выйти из программы после ошибки? | |
---|---|
spammail_88 Автор Сообщений: 108 Дата регистрации: 13.11.2010 |
Программа запускается как отдельный exe. Не в среде VFP. Хочу сделать так, чтобы при возникновении ошибки, программа выводила данные об ошибке и сразу закрывалась, не рискуя потерять данные в таблицах.
Все это выглядит приблизительно так: Запускается форма TopLevel. В ней ещё несколько модальных форм. В последней модальной стартует длинная сложная функция. И, допустим, в середине этой функции происходит ошибка. Ловлю ее так:
Дальше вывожу сообщение и выхожу:
И вот с выходом проблемы:
Так все же, как в случае возникновения ошибки грамотно остановить выполнение последующего кода, закрыть все таблицы, формы (на которых есть таймеры), отпустить индексы, курсоры, и выйти из программы? И все это втихую. Без каких-либо сообщений об ошибках, которые будут возникать при закрытии. Исправлено 1 раз(а). Последнее : spammail_88, 07.10.18 00:39 |
Re: Как выйти из программы после ошибки? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не обрабатывая ошибку "снаружи", пытаясь при этом корректно всё закрыть, а обрабатывая ошибки по всей цепочке вызовов - удобнее это делать через try catch, включая возможную эскалацию ошибки в вызывающий код (если корректно обработать ошибку и продолжить выполнение программы нельзя). Но это должно быть ВЕЗДЕ - по всем методам и процедурам, включая стартовую с READ EVENTS.
Для "тупого" выхода есть RETURN TO, и кроме того закрывать формы нужно в обратном порядке, предусматривая при этом что некоторые формы могут закрыться "сами собой" (т.е. грубо говоря при закрытии 5-й формы вполне может автоматически закрыться и 3-я с 4-й, и простой цикл закрытия "сломается" на попытке обратиться к 4-й форме). Таймеры не исполняют свой код пока работает другой фоксовый код - т.е. они не будут запускаться ни "в процессе", ни тем более после "закрытия всего". Конечно если явно не дать им такой возможности, создав состояние ожидания. ------------------ WBR, Igor |
Re: Как выйти из программы после ошибки? | |
---|---|
spammail_88 Автор Сообщений: 108 Дата регистрации: 13.11.2010 |
Нереально, много переписывать. (весь код обепить в TRY ... CATCH) Я сам был удивлен, но, почему то, последняя запущенная форма в массиве .Forms имеет индекс 1. А основная 5. То есть так и выходит, что формы закрываются в обратном порядке. На момент завершения цикла у каждой формы .Release уже сработал, а элемент массива .Forms еще остался. То есть смещения массива не происходит. Как мне кажется, от таких ситуаций помогает это:
После RETURN TO MASTER в fQuit() больше ничего не выполняется в том числе и QUIT. И программа не закрывается, даже не смотря на то, что главная программа выглядит как то так:
Исправлено 1 раз(а). Последнее : spammail_88, 07.10.18 09:47 |
Re: Как выйти из программы после ошибки? | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
И крестик в правом углу становится недоступным? Остаются висящие ссылки. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Как выйти из программы после ошибки? | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Не пробовали думать над тем "как ЭТО может работать"? Отключаем ожидание после отключения ожидания? ------------------ Лень - это неосознанная мудрость. |
Re: Как выйти из программы после ошибки? | |
---|---|
spammail_88 Автор Сообщений: 108 Дата регистрации: 13.11.2010 |
В этом и вопрос. Как их убрать «оптом»? (Закрыть программу “без шума и пыли”, и потери данных, независимо от того, что происходило до появления ошибки) Ну, по идее, на CLEAR EVENTS все должно закончится, а QUIT так, для верности. Честно говоря, тупо переписал без глубокого понимания вот отсюда: www.tek-tips.com или отсюда: fox.wikis.com Исправлено 1 раз(а). Последнее : spammail_88, 08.10.18 23:23 |
Re: Как выйти из программы после ошибки? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В общем случае никак. Т.к. сама программа должна уметь способствовать своему корректному закрытию. Формы должны уметь корректно разгружаться, в т.ч. откатывать транзакции, закрывать буферизованные курсоры, покидать "невалидные" поля ввода, обходить запросы на "закрытие с сохранением" если таковое предусмотрено, не должно быть ссылок на внутренние контролы форм (или должен быть предусмотрен механизм их принудительного обнуления), должен быть выстроен строгий порядок закрытия форм, особенно если имеются модальные "цепочки" - тупой проход по коллекции forms совершенно "не катит" в этом случае... В общем проще забить, чем делать "правильно и надёжно работающее в любых ситуациях решение"
Ну и да, в большинстве случаев ошибка НЕ должна приводить к закрытию всей программы - таковых ошибок на самом деле весьма мало, и как правило они не позволяют адекватно себя обработать (скажем нехватка памяти или пространства стека - когда даже банальное присвоение значения переменной может вызывать целый каскад ошибок завершающихся c005)... Большинство "ошибок" должны обрабатываться сугубо локально и просто завершать некоторую "процедуру" с соответстсувующим статусом/возвращаемым значением, не пытаясь убить нах всю прогу ------------------ WBR, Igor |
Re: Как выйти из программы после ошибки? | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
По какой идее? До Clear Events как собрались доходить? С какого перепугу Read Evrents должен закончиться? Если еще и учесть, что именно Clear Events заставляет завершиться Read Events и перейти на следущую за Read Events команду? ------------------ Лень - это неосознанная мудрость. |
Re: Как выйти из программы после ошибки? | |
---|---|
spammail_88 Автор Сообщений: 108 Дата регистрации: 13.11.2010 |
Методом танцев с бубном пришел к следующему:
Чтобы не вылетали окна типа OPEN DBF… дописал CREATE CURSOR A (A c(1)), чтобы что-то было в активной области. Поскольку перед QUIT все таблицы уже закрыты, хвосты которые будут выполнятся после QUIT в таблицах уже ничего не впишут. И по любому выпадут ошибкой. А ON ERROR CANCEL прикроит их. Работало, но иногда вылетало окно “Cannot Quit Visual FoxPro”. Нажимал ОК и все закрывалось. Дописал ON SHUTDOWN fQuit(). Теперь на QUIT делает еще раз проход по всей функции fQuit() и окно “Cannot Quit Visual FoxPro” не вылетает. Соглашусь, так не делается. Коряво, горбато, неправильно, но в моем случае работает. Спасибо всем откликнувшимся. |
Re: Как выйти из программы после ошибки? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
На том и стоим ------------------ WBR, Igor |
Re: Как выйти из программы после ошибки? | |
---|---|
Chemberzhy Сообщений: 13142 Откуда: Измаил Дата регистрации: 28.04.2009 |
Тихонько, чтобы никто не увидел Sorry за offtop ------------------ Что-то с памятью моей стало, всё что было не со мной- помню. |
Re: Как выйти из программы после ошибки? | |
---|---|
Божья_коровка Сообщений: 25731 Дата регистрации: 23.08.2001 |
+100 Я немного недопонимаю, для чего ТС-у закрывать всё приложение при возникновении какой либо ошибки (он так и не написал при любой ошибке он это делает или нет). И ведь если просто закрыть прогу с ошибкой, то как потом ТС будет ее исправлять. Т.е. нужно понять что за ошибка, в следствие чего она возникла, хотя бы иметь в наличии текст ошибки. А если приложение сразу автоматом срубается и текст ошибки нигде не фиксируется (ну мало ли может у ТС предусмотрен журнал куда он фиксирует ошибки или лог какой, он ничего не написал), то как потом распознавать, что же произошло....Если ошибка никак не обрабатывается, то что потом с ней делать? ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... Исправлено 2 раз(а). Последнее : Божья_коровка, 11.10.18 08:44 |
Re: Как выйти из программы после ошибки? | |
---|---|
spammail_88 Автор Сообщений: 108 Дата регистрации: 13.11.2010 |
Да, при любой. Программа прямая как линия, никакой многозадачности. Везде модальные формы, в центре программы – одна функция. В случае проблемы закрываю, чтобы перестраховаться, что в результате ошибки я не получу неправильные данные (никаких результатов лучше, чем неправильный результат). Хороший результат – это когда программа запустилась с нуля и отработала без ошибок.
Конечно, есть лог. Без этого никуда. О нем, и о многих других вещах умолчал, так как на прямую сути вопроса (принудительное закрытие программы) они не касаются. |
Re: Как выйти из программы после ошибки? | |
---|---|
прошелмимо Сообщений: 784 Дата регистрации: 21.02.2012 |
дарю слона, посмотреть.
родитель не я, - дорабатывал для себя код, доставшийся по наследству затем использовал для всех проектов. на старте пишем on error DO merror ; WITH ERROR(), MESSAGE(), PROGRAM(), LINENO(1), MESSAGE(1) IN merror.fxp
init отображаемого экрана с ошибками (делал кучу закладок с различ.инфой: сообщение, стек вызова, перем.памяти, инфа для разраба с возм посылки скрина и описалов и логов по мылу) + для разраба была кнопень с отладкой, - мечта просмотр дампа у немцев отдыхает.
начитка стека вызова
на прослучай, - как у немцев, тока я и без соплей до этого додумывался
Исправлено 3 раз(а). Последнее : прошелмимо, 12.10.18 11:56 |
© 2000-2024 Fox Club  |