Как установить значение ошибки?

У меня есть два вызова двух разных методов:

void func1() 
{
  // do something 
  if (fail) 
  {
    // then set errno to EEXIST

  }

}

И второй способ:

void func2() 
{
  // do something 
  if (fail) 
  {
    // then set errno to ENOENT

  }

}
  1. Когда я устанавливаю errno в какое-то значение, что он делает? просто проверка ошибок?

  2. Как я могу установить errno в вышеуказанных методах func1 и func2 на EEXIST и ENOENT

Спасибо


person JAN    schedule 28.07.2012    source источник


Ответы (2)


Для всех практических целей вы можете рассматривать errno как глобальную переменную (хотя обычно это не так). Поэтому включите errno.h и просто используйте его:

errno = ENOENT;

Вы должны спросить себя, является ли errno лучшим механизмом сообщения об ошибках для ваших целей. Можно ли настроить функции так, чтобы они сами возвращали код ошибки?

person cnicutar    schedule 28.07.2012
comment
Обычно errno используется для сообщения об системных ошибках. Вы чувствуете, что ваша библиотека или ваш код являются частью системы? Если нет, используйте другой механизм для сообщения об ошибках. - person Basile Starynkevitch; 28.07.2012
comment
Не обязательно, служебные функции, такие как strtol(), также возвращают, например, ERANGE, что на самом деле не является системной ошибкой. - person proteus; 04.01.2015
comment
Примером места, где может быть уместно установить errno, может быть обратный вызов функции чтения или записи, переданный в funopen(). В этом случае ожидается, что ваша реализация будет соответствовать контракту системного вызова (read() или write()), поэтому имеет смысл вернуть -1 в случае ошибки и установить errno с конкретной ошибкой. - person Corbell; 23.06.2015
comment
MSVS определяет errno_t __cdecl _set_errno(_In_ int _Value); и _get_errno — имеют ли они какую-либо ценность? - person PJTraill; 24.11.2016
comment
@BasileStarynkevitch, обычно принято устанавливать для errno ноль перед вызовом некоторых библиотечных функций (например, см. readdir или getpriority) . Нет ничего плохого в том, чтобы использовать errno в вашей библиотеке времени выполнения или прямо в функциях программы. Это стандартный механизм, поэтому вы не должны использовать errno, если ваша функция является оболочкой, которая расширяет реализацию некоторых библиотечных функций, которые уже используют errno. - person imbearr; 15.05.2020

ИМО, стандарт errno предназначен для системного уровня. Мой опыт - не загрязнять их. Если вы хотите имитировать стандартный механизм C errno, вы можете сделать какое-то определение, например:

/* your_errno.c */
__thread int g_your_error_code;

/* your_errno.h */
extern __thread int g_your_error_code
#define set_your_errno(err) (g_your_error_code = (err))
#define your_errno (g_your_error_code)

а еще можно реализовать your_perror(err_code). Дополнительную информацию см. в описании реализации glibc.

person coanor    schedule 20.01.2013