ООО "ЛесИС" - ГИС TOPOL-L для лесного хозяйства, лесоустройства и арендаторов лесного фонда
ООО "ЛесИС" - ГИС TOPOL-L для лесного хозяйства, лесоустройства и арендаторов лесного фонда
lesis@ya.ru
+7(916)615-42-77

ФОРУМ ТЕХПОДДЕРЖКИ ГИС TOPOL-L

Объявление

Для участия в работе закрытой, технической части форума нужно быть пользователем ГИС TopoL-L2 (10.0) и Зарегистрироваться!

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ФОРУМ ТЕХПОДДЕРЖКИ ГИС TOPOL-L » ПОЖЕЛАНИЯ ПО РАЗРАБОТКАМ (ВРЕМЕННО ЗАМОРОЖЕНА) » Обработка системных ошибок. УЧИТЫВАЕТСЯ ПРИ ВОЗМОЖНОСТИ


Обработка системных ошибок. УЧИТЫВАЕТСЯ ПРИ ВОЗМОЖНОСТИ

Сообщений 1 страница 4 из 4

1

Пожелание на далекое светлое будущее :)

В связи с тем, что у пользователей регулярно возникают вопросы типа "что означает ошибка", "тут что то выскочило не по-русски" и т.д., и разработчикам приходится тратить время на объяснение текста системных ошибок,
предлагаю в коде программы постепенно реализовывать обработчики системных ошибок конструкциями языка программирования типа try...except... с выдачей соответсвующего понятного сообщения, чтобы пользователь мог видеть хотя бы на каком этапе возникла ошибка и попытаться ее устранить не прибегая к помощи разработчиков.

Сравните например сообщения "Не выполнена проверка подлинности" и "чего-то существенного не хватает, нет таблиц БД, которые программа должна использовать, нет полей в таблицах, к которым идёт обращение за данными и т.п.". Получив первое сообщение, я бы начал думать о лицензии, сбое ключа, а получив второе, понял бы что проблема с базой и скорее всего устранил бы ее за пару минут...

2

Подумаю, что можно сделать, не так всё просто. Ну, блоки try { исполняемый код } catch { except-обработка ситуации } везде в программе существуют, причём образуют сложную иерархическую структуру, а если наши обработчики чего-то не поймали, то это "ловится" на верхних уровнях встроенными средствами системы обработки, которые создаёт компилятор. Если бы этого не было, программа все время бы "падала". Но когда  при исполнении происходит переход в except-блок, мы получаем внятное текстовое сообщение только в случае перехода туда от нашего обработчика throw Exception("..."), а если что-то возникает вне нашего контроля, то никакого сообщения, только системный код, из которого системный обработчик и формирует "странные" сообщения, то на русском, то типа EccessViolation с адресом, где, если 0, то обращение по нулевому (пустому) указателю на функцию или данные, а если не 0, то вообще ничего сказать нельзя. Ну, хотя бы, просто прерывается исполнение кода и программа не "падает", что уже хорошо. Я когда-то попытался выдавать расшифровку кода системными средствами, но ясности это не внесло, а иногда даже наоборот, напрочь исчезало сообщение на русском (на русском обычно исключения от Windows и его компонент).

Блоков try { ... } catch { ... } в программе, думаю, многие сотни, индивидуальная обработка в каждом - это нереально. Только если сделать свою функцию обработки для except-блоков. Изучу вопрос.

3

Дмитрий Александрович написал(а):

если что-то возникает вне нашего контроля, то никакого сообщения, только системный код, из которого системный обработчик и формирует "странные" сообщения, то на русском, то типа EccessViolation

Не знаю какой язык используется, но должны же в нем быть обработчики не только ожидаемых exception-ов, а вообще любых, в том числе системных? Которые как вы пишете, вне контроля. Или из try всегда только один выход?

try
  пробуем запустить какую-то процедуру, например запись площадей линейников в базу
catch {*предполагаемая ошибка, например текст в числовом поле*}
  если поймали, выдаем сообщение "Ошибка на этапе записи площадей линейников в базу:"+"текст в числовом поле"
catсh {*любая другая не предусмотренная исключительная ситуация*}
  если так, то выдаем сообщение "Ошибка на этапе записи площадей линейников в базу:"+"коды системной ошибки"

Тут смысл не в переводе непредсказуемых системных сообщений, а в указании на этап возникновения ошибки. Так например можно будет отловить знакомое всем, попавшее даже в инструкцию, сообщение EAcceessViolation на старте программы. Предполагаю, что там есть запуски try без catch.

Да, на словах у меня всё просто, но знаю, что программирование труд титанический, поэтому и пишу, что это пожелание на будущее, к новым модулям программы. Спасибо за ответ.

4

Алексей Курагин написал(а):

Не знаю какой язык используется, но должны же в нем быть обработчики не только ожидаемых exception-ов, а вообще любых, в том числе системных?

Мы используем С++, безусловно в нём есть обработчики exception, и в программе они есть.

Пример текста программы.

Приведу пример:
void __fastcall TAreaBlnc::SaveMenuClick(TObject *Sender)
{
  ServDS->WaitMsg("Сохранение данных в БД.", 0, 0 );
  try  {
    MsgRichEdit->Clear();
    if( Sender == SaveMenu )  {
      StoreKvDB();        ServDS->WaitMsg( NULL, 5, 101 );
      StoreAreas();       ServDS->WaitMsg( NULL, 75, 101 );
      // Сохраняем описания линейных выделов в карту
      SaveLinVydParam();      ServDS->WaitMsg( NULL, 78, 101 );
          ...
  } catch( Exception &E )  {
    ProtocolMsg("Ошибка: " + E.Message );
  }
  // Сохраняем протокол :
  MsgRichEdit->Lines->SaveToFile( ExtractFilePath( ThmDSet->DataSrcLocation ) + "BalansPl.log.rtf");
  ServDS->WaitMsg( NULL, 100, 0 );
}
... и в каждой вызываемой функции соответственно тоже есть:
void __fastcall TAreaBlnc::StoreKvDB(void)
{
  ServDS->WaitMsg("Сохранение площадей кварталов.", 101, 0 );
  try  {
    // Запись площади - лесничество
       ...
    // Цикл по всем кварталам
    for( int ik = 0; ik < NumOfKv; ik ++ )  {
      ...
    } // конец цикла
  }  catch( Exception &E )  {
    AnsiString msg = "Ошибка в таблице описания кварталов: " + E.Message;
    Application->MessageBox( msg.c_str(), Application->Title.c_str(), MB_OK|MB_ICONSTOP);
  }
  ServDS->WaitMsg(" ", 101, 0 );
}

Именно так сейчас обрабатываются возникающие системные ошибки, которые могут возникать вне явного контроля, а E.Message - текст сообщения, который возвращает в этом случае система.


Вы здесь » ФОРУМ ТЕХПОДДЕРЖКИ ГИС TOPOL-L » ПОЖЕЛАНИЯ ПО РАЗРАБОТКАМ (ВРЕМЕННО ЗАМОРОЖЕНА) » Обработка системных ошибок. УЧИТЫВАЕТСЯ ПРИ ВОЗМОЖНОСТИ



Почтовый адрес для ЗАКАЗНЫХ писем:
С.П.Грешнов, +7(916)615-42-77, 108832, А/Я №1
НЕ ИСПОЛЬЗОВАТЬ курьерскую доставку!!!
E-Mail: lesis@ya.ru
Вопросы общего характера:
+7(916)615-42-77
РОССИЙСКАЯ ФЕДЕРАЦИЯ
Общество с ограниченной ответственностью "ЛЕСИС"
ОГРН: 1035007204902, ИНН: 5036046400, КПП: 503601001