C error handling

Created By: chatGPT

Error handling in C is crucial to ensure that programs operate reliably and to provide informative feedback when something goes wrong. In C, errors are often handled by returning error codes or using error handling functions like errno. Understanding how to manage errors effectively can enhance your program's robustness.
// Example of error handling using return values
#include <stdio.h>
#include <stdlib.h>

int exampleFunction(int divisor) {
    if (divisor == 0) {
        return -1; // Indicate an error (division by zero)
    }
    return 10 / divisor;
}

int main() {
    int result;
    result = exampleFunction(0);
    if (result == -1) {
        printf("Error: Division by zero!\n");
        return EXIT_FAILURE;
    }
    printf("Result: %d\n", result);
    return EXIT_SUCCESS;
}
Another way to manage errors in C is to use global error reporting with the errno variable, which is defined in <errno.h>. This variable is set by system calls and some library functions when an error occurs. The value of errno is preserved until another error occurs, so it’s important to check its value immediately after an error-prone function.
// Example using errno
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (!file) {
        printf("Error opening file: %s\n", strerror(errno));
        return EXIT_FAILURE;
    }
    // Perform file operations...
    fclose(file);
    return EXIT_SUCCESS;
}
Using assertions can also help catch errors during development. The assert macro will terminate the program if the given expression evaluates to false. This is useful for identifying bugs, but it’s not advisable for production error handling since it removes the opportunity for graceful handling.
// Example using assert
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void processValue(int value) {
    assert(value >= 0); // Ensure value is non-negative
    printf("Processing value: %d\n", value);
}

int main() {
    processValue(10);
    processValue(-5); // This will trigger the assertion
    return 0;
}
Error handling in C often involves a combination of the techniques above. Utilize error codes, errno, and assert together to create safer and more maintainable code. Always ensure that your application can handle unexpected inputs or situations gracefully without crashing.
// Comprehensive error handling example
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int safeDivision(int numerator, int denominator) {
    if (denominator == 0) {
        errno = EDOM; // Domain error
        return -1;
    }
    return numerator / denominator;
}

int main() {
    int result;
    result = safeDivision(10, 0);
    if (result == -1) {
        if (errno == EDOM) {
            printf("Error: Division by zero!\n");
        }
        return EXIT_FAILURE;
    }
    printf("Result: %d\n", result);
    return EXIT_SUCCESS;
}
Introduction And SetupVariablesData TypesIntFloatDoubleCharVoidUnsignedSignedConstantsEnumerationsArraysStringsStructsUnionsTypedefsPointersDynamic Memory AllocationMallocCallocReallocFreeFunctionsFunction DeclarationsFunction DefinitionsFunction CallsReturn StatementInline FunctionsRecursionHeader FilesPreprocessor DirectivesControl FlowIf StatementElse StatementElse If StatementSwitch StatementCase StatementDefault CaseLoopsFor LoopWhile LoopDo While LoopBreak StatementContinue StatementGoto StatementLabelsOperatorsArithmetic OperatorsRelational OperatorsLogical OperatorsBitwise OperatorsAssignment OperatorsConditional (ternary) OperatorComma OperatorSizeof OperatorData StructuresLinked ListsStacksQueuesTreesGraphsFunction PointersCallbacksMacrosCommentsSingle Line CommentsMulti Line CommentsSyntaxSyntax ErrorsCompilation ErrorsDebuggingStandard Input OutputPrintfScanfFile HandlingFopenFcloseFreadFwriteFprintfFgetsFputsError HandlingErrnoAssertionsExit FunctionExit CodesEvent HandlingSignal HandlingInterrupts