LINUX.ORG.RU

Организация сообщений об ошибках?


0

0

Как вы организуете сообщения об ошибках?

у меня сейчас чтото вроде такого:

typedef enum
	{
		can_not_create_file,
		can_not_open_file,
		ERROR_AMOUNT	
	} ErrorType;

char errorMessages[ERROR_AMOUNT][100] = {
	"Can't create file.",
	"Can't open file."
};

в случае возникновения ошибки ErrorType err_code = can_not_create_file; и гдето вызывается обработчик, который в соответствии этому err_code и работает.

Поделитесь, кто как организует сообщения об ошибках? Не саму обработку, а именно сообщения.

[fat]

public class FileNotExistsException {}

Только так, да.

[/fat]

l5k
()
Ответ на: комментарий от Legioner

>Где всякие %s, чтобы писать «Can't create file /tmp/abra.cadabra»?

это я опустил, для простоты изложения:)

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

как вариант, готовое:

http://library.gnome.org/devel/glib/stable/glib-Error-Reporting.html

Использовать просто:

#define MY_ERROR_QUARK g_quark_from_static_string («package-name»)


void my_func(GError ** my_error)
{
g_propagate_error (
my_error,
g_error_new (MY_ERROR_QUARK,
1 /* код ошибки */,
_(«Warning! This is for testing only: %s»), «SOME_CONST»
)
);
}
...

GError *my_error = NULL;

my_func(&my_error);

if (my_error != NULL)
{
switch(my_error->code){
case 1:
...
break;
default:
...
break;
}
printf(«%s\n»,my_error->message);
g_error_free (my_error);
}

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

char errorMessages[ERROR_AMOUNT][100]

char *errorMessages[ERROR_AMOUNT]

А так почти тоже самое и юзаю. strerror для системных.

Гораздо больше геморроя с тем, как его пропагейтить... В libpng вот просто хендлер через setjmp делается. Достаточно удобно, но не всегда гибко, если вдруг какую-то ошибку ты решаешь таки обрабатывать локально, а она нигде не ловится в надежде на longjmp

ratatosk
()

Вопрос интересный. ИМХО однозначно красивого способа нет. Достаточно гибким может быть способ, когда в качестве одного из параметром вызываемой функции передается объект, поля которого заполнятся необходимым набором данных об ошибке.

Есть мысль создавать для каждого типа ошибки отдельный объект и заводить один единственный экземпляр этого объекта в качестве глобальной переменной. Такой объект лучше всего сделать неизменяемым в ходе функционирования программы, однако на стадии инициализации он может получить все необходимое для формирования текста ошибки на нужном языке.

Адрес этого объекта будет уникальным идентификатором ошибки и заменит собой enum {} ErrorType; Причем новый тип ошибки можно создавать «локально», не обращая внимания на типы ошибок сделанные ранее.

З.Ы. Это лишь мысли. На практике так я ещё не делал.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.