Advanced Error Handling Techniques in C

C Programming @ Freshers.in

Error handling is a crucial aspect of C programming, ensuring your code remains robust and reliable even when faced with unexpected situations. In this article, we will explore advanced error handling techniques in C. You will learn best practices, advanced topics, and real-world examples with outputs, empowering you to develop resilient and fault-tolerant C programs.

The Significance of Error Handling

Error handling in C is essential for identifying and managing exceptional situations that can occur during program execution. These situations may include file not found, division by zero, memory allocation failures, and more. Effective error handling ensures graceful program termination and provides valuable information for debugging and troubleshooting.

Basic Error Handling with errno

C provides a standard error handling mechanism using the errno variable and functions like perror and strerror. Let’s start with a basic example:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        perror("Error");
        fprintf(stderr, "Error code: %d\n", errno);
    } else {
        fclose(file);
    }
    return 0;
}

In this example, we attempt to open a non-existent file. If the file opening fails, we use perror to print an error message along with the system error description obtained from errno.

Output:

Error: No such file or directory
Error code: 2

Advanced Error Handling Techniques

Custom Error Messages

To provide more informative error messages, you can create custom error messages based on the error code. Let’s modify the previous example to include custom error messages:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        if (errno == ENOENT) {
            fprintf(stderr, "Error: File not found.\n");
        } else {
            perror("Error");
        }
        fprintf(stderr, "Error code: %d\n", errno);
    } else {
        fclose(file);
    }
    return 0;
}

Here, we use the ENOENT error code to identify the specific error and provide a custom error message accordingly.

Output:

Error: File not found.
Error code: 2

Error Handling with setjmp and longjmp

For more complex error handling scenarios, you can use the setjmp and longjmp functions. These functions allow you to jump back to a specific point in your program when an error occurs. Here’s a simplified example:

#include <stdio.h>
#include <setjmp.h>
jmp_buf jump_buffer;
void handle_error() {
    fprintf(stderr, "An error occurred. Handling it gracefully.\n");
    longjmp(jump_buffer, 1);
}
int main() {
    if (setjmp(jump_buffer) == 0) {
        // Normal program execution
        printf("Program is running smoothly.\n");
        // Simulate an error
        handle_error();
    } else {
        // Error handling
        printf("Resuming after error.\n");
    }
    return 0;
}

In this example, we use setjmp to set a point to which the program can jump back when an error occurs. The handle_error function simulates an error and uses longjmp to jump back to the error-handling point.

Output:

Program is running smoothly.
An error occurred. Handling it gracefully.
Resuming after error.
Author: user