6 ex__exceptions_8c
gullradriel edited this page 2026-10-09 00:55:18 +02:00

examples/ex_exceptions.c

Functions

Name
int parsing_exception(int boolean)
int overflow_exception(int boolean)
int main(void )
int divzero_exception(int boolean)
int array_exception(int boolean)
int all_exception(int boolean)

Functions Documentation

function parsing_exception

int parsing_exception(
    int boolean
)

function overflow_exception

int overflow_exception(
    int boolean
)

function main

int main(
    void 
)

function divzero_exception

int divzero_exception(
    int boolean
)

function array_exception

int array_exception(
    int boolean
)

function all_exception

int all_exception(
    int boolean
)

Source code

/*
 * Nilorea Library
 * Copyright (C) 2005-2026 Castagnier Mickael
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#include "nilorea/n_log.h"
#include "nilorea/n_exceptions.h"

int array_exception(int boolean) {
    if (boolean) {
        n_log(LOG_NOTICE, "Throwed signal");
        Throw(ARRAY_EXCEPTION);
    }
    n_log(LOG_NOTICE, "No signal Throwed !");

    return 1;
}

int divzero_exception(int boolean) {
    if (boolean) {
        n_log(LOG_NOTICE, "Throwed signal");
        Throw(DIVZERO_EXCEPTION);
    }
    n_log(LOG_NOTICE, "No signal Throwed !");

    return 1;
}

int overflow_exception(int boolean) {
    if (boolean) {
        n_log(LOG_NOTICE, "Throwed signal");
        Throw(OVERFLOW_EXCEPTION);
    }
    n_log(LOG_NOTICE, "No signal Throwed !");

    return 1;
}

int parsing_exception(int boolean) {
    if (boolean) {
        n_log(LOG_NOTICE, "Throwed signal");
        Throw(PARSING_EXCEPTION);
    }
    n_log(LOG_NOTICE, "No signal Throwed !");

    return 1;
}

int all_exception(int boolean) {
    if (boolean) {
        n_log(LOG_NOTICE, "Throwed signal");
        Throw(PARSING_EXCEPTION);
    }
    n_log(LOG_NOTICE, "No signal Throwed !");

    return 1;
}

int main(void) {
    set_log_level(LOG_STDERR);
    set_log_level(LOG_DEBUG);

    puts("ArrayNoCatch");
    Try {
        n_log(LOG_INFO, "Trying signal:ARRAY_EXCEPTION false");
        array_exception(0);
        n_log(LOG_NOTICE, "Trying signal:ARRAY_EXCEPTION true");
        array_exception(1);
    }
    EndTry;
    puts("ArrayCatch");
    Try {
        n_log(LOG_NOTICE, "Trying signal:ARRAY_EXCEPTION false");
        array_exception(0);
        n_log(LOG_NOTICE, "Trying signal:ARRAY_EXCEPTION true");
        array_exception(1);
    }
    Catch(ARRAY_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal ARRAY_EXCEPTION");
    }
    EndTry;
    puts("DivZeroNoCatch");
    Try {
        n_log(LOG_NOTICE, "Trying signal:DIVZERO_EXCEPTION false");
        divzero_exception(0);
        n_log(LOG_NOTICE, "Trying signal:DIVZERO_EXCEPTION true");
        divzero_exception(1);
    }
    EndTry;
    puts("DivZeroCatch");
    Try {
        n_log(LOG_NOTICE, "Trying signal:DIVZERO_EXCEPTION false");
        divzero_exception(0);
        n_log(LOG_NOTICE, "Trying signal:DIVZERO_EXCEPTION true");
        divzero_exception(1);
    }
    Catch(DIVZERO_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal DIVZERO_EXCEPTION");
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:OVERFLOW_EXCEPTION false");
        overflow_exception(0);
        n_log(LOG_NOTICE, "Trying signal:OVERFLOW_EXCEPTION  true");
        overflow_exception(1);
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:OVERFLOW_EXCEPTION false");
        overflow_exception(0);
        n_log(LOG_NOTICE, "Trying signal:OVERFLOW_EXCEPTION  true");
        overflow_exception(1);
    }
    Catch(OVERFLOW_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal OVERFLOW_EXCEPTION ");
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:PARSING_EXCEPTION false");
        parsing_exception(0);
        n_log(LOG_NOTICE, "Trying signal:PARSING_EXCEPTION true");
        parsing_exception(1);
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:PARSING_EXCEPTION false");
        parsing_exception(0);
        n_log(LOG_NOTICE, "Trying signal:PARSING_EXCEPTION true");
        parsing_exception(1);
    }
    Catch(PARSING_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal PARSING_EXCEPTION");
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:ALL_EXCEPTION false");
        all_exception(0);
        n_log(LOG_NOTICE, "Trying signal:ALL_EXCEPTION true");
        all_exception(1);
    }
    EndTry;
    Try {
        n_log(LOG_NOTICE, "Trying signal:ALL_EXCEPTION false");
        all_exception(0);
        n_log(LOG_NOTICE, "Trying signal:ALL_EXCEPTION true");
        all_exception(1);
    }
    Catch(GENERAL_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal matching GENERAL_EXCEPTION");
    }
    EndTry;

// nest Try Catch blocks are going to generate a masked (shadowed) variable declaration warning, hence the temporary disable
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
    Try {
        n_log(LOG_NOTICE, "Trying mixed Try-Catch blocks, we are inside block 1");
        Try {
            n_log(LOG_NOTICE, "We're inside block 2");
            Throw(ARRAY_EXCEPTION);
        }
        Catch(GENERAL_EXCEPTION) {
            n_log(LOG_NOTICE, "Caught signal matching GENERAL_EXCEPTION inside block 2");
        }
        EndTry;
        Throw(OVERFLOW_EXCEPTION);
    }
    Catch(GENERAL_EXCEPTION) {
        n_log(LOG_NOTICE, "Caught signal matching GENERAL_EXCEPTION inside block 1");
    }
    EndTry;
#pragma GCC diagnostic pop

    /* test CatchAll macro */
    puts("CatchAll test");
    Try {
        n_log(LOG_NOTICE, "Trying CatchAll: throwing DIVZERO_EXCEPTION");
        Throw(DIVZERO_EXCEPTION);
    }
    CatchAll() {
        n_log(LOG_NOTICE, "CatchAll caught the exception");
    }
    EndTry;

    exit(0);
}