Error Tutorial

Introduction

The Eina error module provides a way to manage errors in a simple but powerful way in libraries and modules. It is also used in Eina itself. Similar to libC's errno and strerror() facilities, this is extensible and recommended for other libraries and applications.

Registering messages

The error module can provide a system that mimic the errno system of the C standard library. It consists in 2 parts:

So one has to fisrt register all the error messages that a program or a lib should manage. Then, when an error can occur, use eina_error_set(), and when errors are managed, use eina_error_get(). If eina_error_set() is used to set an error, do not forget to call before eina_error_set0), to remove previous set errors.

Here is an example of use:

 #include <stdlib.h>
 #include <stdio.h>

 #include <eina_error.h>

 Eina_Error MY_ERROR_NEGATIVE;
 Eina_Error MY_ERROR_NULL;

 voi *data_new()
 {
    eina_error_set(0);

    eina_error_set(MY_ERROR_NULL);
    return NULL;
 }

 int test(int n)
 {
    eina_error_set(0);

    if (n < 0)
    {
       eina_error_set(MY_ERROR_NEGATIVE);
       return 0;
    }

    return 1;
 }

 int main(void)
 {
    void *data;

    if (!eina_init())
    {
       printf ("Error during the initialization of eina_error module\n");
       return EXIT_FAILURE;
    }

    MY_ERROR_NEGATIVE = eina_error_msg_register("Negative number");
    MY_ERROR_NULL = eina_error_msg_register("NULL pointer");

    data = data_new();
    if (!data)
    {
       Eina_Error err;

       err = eina_error_get();
       if (err)
          printf("Error during memory allocation: %s\n",
                 eina_error_msg_get(err));
    }

    if (!test(0))
    {
       Eina_Error err;

       err = eina_error_get();
       if (err)
          printf("Error during test function: %s\n",
                 eina_error_msg_get(err));
    }

    if (!test(-1))
    {
       Eina_Error err;

       err = eina_error_get();
       if (err)
          printf("Error during test function: %s\n",
                 eina_error_msg_get(err));
    }

    eina_shutdown();

    return EXIT_SUCCESS;
 }

Of course, instead of printf(), eina_log_print() can be used to have beautiful error messages.