Russian Qt Forum
Ноябрь 25, 2024, 17:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Лог работы приложения  (Прочитано 4364 раз)
merke
Гость
« : Декабрь 25, 2010, 19:40 »

Всем привет!

Пишу приложение. нужно ввести полный лог его работы:

1. отлавливать все ошибки и писать их в лог
2. писать в лог каждый вход в процедуру или функцию

например если программить на Visual Basic 6 там есть такое

Код
Visual Basic
On Error goto Erh1
 
...
...
...
какой то код
...
...
...
Код
Visual Basic
exit sub
Erh1:
  call setLog(err.msg);
 

Т.е. если происходит какая то ошибка в процедуре или функции, то срабатывает обработчик ошибок и меня перекидывает на Erh1 и уже вызываю функцию   call setLog(err.msg); с текстом ошибки.

Теперь как мне такое же реализовать на Qt? Использование try catch?

Код:
try
{
...
...
...
какой то код
...
...
...
}
catch(...)
{
setLog([color=red][b]????????[/b][/color]);
}

Как понять, что за ошибка произошла?

Подскажите, пожалуйста, буду очень благодарен помощи!
« Последнее редактирование: Декабрь 25, 2010, 20:02 от Александр » Записан
Fat-Zer
Гость
« Ответ #1 : Декабрь 25, 2010, 20:12 »

Это вопроса не кьюта, это вопрос C++
1) делаешь классы эксепшенов:
Код
class BaseException
{
public:
virtual char* getMessage()
{return (char*)"Unknown Error.\n";}
std::ostream& printErr(std::ostream &os=std::cerr)
{return os<<getMessage();}
};
 
class Exception1:public BaseException
{
public:
virtual char* getMessage()
{return (char*)"Wrong Size.\n";}
};
 
class Exception2:public BaseException
{
public:
virtual char* getMessage()
{return (char*)"Can't alocate memory.\n";}
};
 
2) Обрабатываешь их примерно так:
Код
try
{
//код
if(error) throw Exception2();
//код
}
catch(BaseException& ex)
{
ex.printErr();
}
 
3) ещё можно почитать про стандартные библиотечные эксепшины
« Последнее редактирование: Декабрь 25, 2010, 20:13 от Fat-Zer » Записан
antzol
Гость
« Ответ #2 : Декабрь 25, 2010, 20:15 »

Код:
#include <stdexcept>
using namespace std;

...

try
{
...
throw runtime_error("any error");
...
}
catch(runtime_error& x)
{
setLog(x.what());
}
« Последнее редактирование: Декабрь 25, 2010, 20:17 от antzol » Записан
brankovic
Гость
« Ответ #3 : Декабрь 25, 2010, 21:31 »

Есть стандартный класс std::exception от которого рекомендуется наследовать все исключения. У него есть метод what, который говорит, что случилось. Поэтому ловить исключения надо так:

Код:
try { /*some code*/ }
catch (std::exception const &e)
{
   std::cerr << "error: " << e.what () << "\n";
}

Но в отличии от VB нельзя поймать деление на ноль или нарушение памяти (access violation).

Поначалу лучше не увлекаться своими исключениями. Используй std::runtime_error:

Код:
if (bad)
   throw std::runtime_error ("bad thing happened!");

По возможности всем этим не надо пользоваться вообще, а делать просто:

Код:
if (bad)
{
   errLog << "bad thing happened!\n";
   return 1;
}
Записан
vunder
Гость
« Ответ #4 : Декабрь 25, 2010, 21:50 »

У меня была похожая задача: в приложении нужно было организовать журнал событий.
В общем сделал так:
 - написал класс, характеризующий сообщение (тип, заголовок, текст и время);
 - форма в главном приложении перехватывает все события (events) и при получении класса-сообщения записывала его в журнал;

Перехват событий через object::eventFilter(QObject *pobj, QEvent *pevent), ну а сам класс сообщения отнаследован от QEvent. Для подробностей могу привести полный код, но все-таки советую почитать про события (events) в Qt
Записан
JamS007
Гость
« Ответ #5 : Декабрь 26, 2010, 00:39 »

Простите, что не создаю новую тему, но думаю тут эта информация тоже пригодиться.

vunder, подскажите может ли Ваш способ быть использован в многопоточном приложении. Я немного почитал про систему событий qt, и мне нравиться Ваш вариант, но так как у каждого потока свой обработчик событий, не будет ли очень накладным и сложным писать обмен событиями между потоками? Стоит ли вообще начинать, и если стоит, что для этого нужно?
Записан
merke
Гость
« Ответ #6 : Декабрь 26, 2010, 05:30 »

Спасибо, но QEvent будет не вариант.
Записан
vunder
Гость
« Ответ #7 : Декабрь 27, 2010, 10:51 »

Цитировать
vunder, подскажите может ли Ваш способ быть использован в многопоточном приложении. Я немного почитал про систему событий qt, и мне нравиться Ваш вариант, но так как у каждого потока свой обработчик событий, не будет ли очень накладным и сложным писать обмен событиями между потоками? Стоит ли вообще начинать, и если стоит, что для этого нужно?
У меня именно многопоточное приложение и все работает отлично. Дополнительно писать ничего не нужно, т.к. поддержка многопоточности в Qt есть и для сингал/слотов, и для событий.
Для объекта QApplication/QCoreApplication устанавливается фильтр событий. В форме отображения перекрывается метод bool eventFilter(QObject *, QEvent *), который из потока событий выбирает нужные события и отображает их в списке.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 22.