72 lines
2.5 KiB
C
72 lines
2.5 KiB
C
#include "m-try.h"
|
|
#include "m-array.h"
|
|
|
|
// Define & register an array of int
|
|
ARRAY_DEF(array, int)
|
|
#define M_OPL_array_t() ARRAY_OPLIST(array, M_BASIC_OPLIST)
|
|
|
|
// This shall be defined once per program to define the global variables needed
|
|
// to handle the exceptions.
|
|
M_TRY_DEF_ONCE()
|
|
|
|
static void f(void)
|
|
{
|
|
M_TRY(f_exception) {
|
|
// Let's define a variable and do stuff:
|
|
// Using M_LET allows the register of destructors for the exception handler.
|
|
M_LET(a, array_t) {
|
|
array_push_back(a, 5);
|
|
array_push_back(a, 4);
|
|
array_push_back(a, 3);
|
|
array_push_back(a, 2);
|
|
array_push_back(a, 1);
|
|
// Throw a M_ERROR_MEMORY exception
|
|
M_THROW(M_ERROR_MEMORY);
|
|
printf("This should never be printed!\n");
|
|
}
|
|
} M_CATCH(f_exception, M_ERROR_MEMORY) {
|
|
// Exception handler than catches the M_ERROR_MEMORY errors.
|
|
// Here the destructor of variable a has been called to free memory
|
|
printf("Memory exception %d received in f function, thrown by %s:%d\n",
|
|
f_exception->error_code, f_exception->filename, f_exception->line);
|
|
}
|
|
}
|
|
|
|
static void g(void)
|
|
{
|
|
M_TRY(f_exception) {
|
|
// Let's define a variable and do stuff:
|
|
// Using M_LET allows the register of destructors for the exception handler.
|
|
M_LET(a, array_t) {
|
|
array_push_back(a, 5);
|
|
array_push_back(a, 4);
|
|
array_push_back(a, 3);
|
|
array_push_back(a, 2);
|
|
array_push_back(a, 1);
|
|
// Throw an unkown exception
|
|
M_THROW(42);
|
|
printf("This should never be printed!\n");
|
|
}
|
|
} M_CATCH(f_exception, M_ERROR_MEMORY) {
|
|
printf("Memory exception %d received in f function, thrown by %s:%d\n",
|
|
f_exception->error_code, f_exception->filename, f_exception->line);
|
|
printf("This should never be printed!\n");
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
// Let's do a global exception handler
|
|
M_TRY(main_exception) {
|
|
f();
|
|
g();
|
|
} M_CATCH(main_exception, 0) {
|
|
// Exception handler than catches all errors.
|
|
// Here the destructor of variable a has been called to free memory
|
|
printf("Exception %d received in main function, thrown by %s:%d\n",
|
|
main_exception->error_code, main_exception->filename, main_exception->line);
|
|
}
|
|
printf("You should run it under valgrind to check that all memory allocations are freed.\n");
|
|
exit(0);
|
|
}
|