In C++ errno is a preprocessor macro that is used for error indication and reporting errors that occur during a function call. It contains error codes so if a call to a function fails somehow then the errno is set to a value that corresponds to the error.
errno is defined in the header file <cerrno> in C++.
Working of errno in C++
The errno works as the explain below:
Initially at the beginning of the program, the errnois set to zero and it changes when any error occurs.- If a function call fails it sets
errno, then we check its value. There is no change in the valueerrnoif no errors occur.
Examples of errorno in C++
The following examples illustrate how we can use errno in different scenarios.
Example 1
The below example demonstrates the usage of errno for reading a file because when we try to open a file it may throw an error.
// C++ program to demonstrate the use of errno for reading a
// file
#include <cerrno>
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
// Defining the filename to be opened.
const char* filename = "myfile.txt";
// Attempting to open the file using ifstream.
ifstream file(filename);
// Checking if the file was not opened successfully or
// not.
if (!file) {
// Switch case based on the error number (errno).
switch (errno) {
case ENOENT: // Case for file not existing.
cerr << "Error: File '" << filename
<< "' doesn't exist." << endl;
break;
case EACCES: // Case for access denied.
cerr << "Error: Permission denied for file '"
<< filename << "'." << endl;
break;
default: // Default case for other errors.
cerr << "Error opening file '" << filename
<< "': " << strerror(errno) << endl;
break;
}
// Return with error code 1 to indicate failure.
return 1;
}
// Closing the file if it was opened successfully.
file.close();
// Return 0 to indicate successful completion.
return 0;
}
Output
Error: File 'myfile.txt' doesn't exist.Explanation: The above example shows how to handle error that we get when we try to open a file using ifstream. It checks for conditions that may give error like file not existing or access being denied by using the errno variable.
Note: Always clear errno after handling errors and use errno=0 to reset the value after handling an error.
Example 2
The below example demonstrates the use of errno to detect error in mathematical operations.
// C++ program to demonstrate the use of errno to detect
// error in mathematical operations.
#include <cerrno>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
// Variable initialization with a value that will cause
// a domain error in sqrt
double x = -1.0;
// Attempt to calculate the square root of x
double result = sqrt(x);
// Check if errno is set to EDOM, indicating a domain
// error in the sqrt function
if (errno == EDOM) {
// Print an error message to stderr and return with
// error code 1
cerr << "Error: Cannot take the square root "
"of a negative number."
<< endl;
return 1;
}
// If no error, print the result
cout << "Square root of " << x << " is: " << result
<< endl;
// Return 0 indicating success
return 0;
}
Output
Error: Cannot take the square root of a negative number.Explanation: The above example checks for EDOM after taking the mathematical values Error. When we try to calculate the square root of a negative number like (-2), that are actually not defined and leads to a domain error.
Error Codes Associated with errorno in C++
There are lots of codes associated with errorno in C++ but some of the commonly used error codes are listed in the below table:
errorno Code | Associated Macro | Description |
|---|---|---|
| 1 | EPERM | Operation not permitted |
| 2 | ENOENT | No such file or directory |
| 3 | ESRCH | No such process |
| 5 | EIO | I/O error |
| 7 | E2BIG | Argument list too long |
| 9 | EBADF | Bad file number |
| 10 | ECHILD | No child processes |
| 11 | EAGAIN | Try again |
| 12 | ENOMEM | Out of memory |
| 13 | EACCES | Permission denied |