Обработка ошибок при смене каталога - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь реализовать функциональность изменений каталога в моей программе, и я хотел бы обработать ошибки с помощью errno.h.

int main(void)
{
    char directory[100];
    scanf("%[^\n]", directory);


    switch(chdir(directory))
        {
            case 0:
                printf("\nSuccess\n");
                break;

            case EACCES:
                perror("\nError ");
                break;

            case EIO:
                perror("\nError ");
                break;

            case ENAMETOOLONG:
                perror("\nError ");
                break;

            case ENOTDIR:
                perror("\nError ");
                break;

            case ENOENT: 
                perror("\nError ");
                break;
        }

    return 0;
}

Он компилируется без ошибок, и я смог изменить каталог, поэтому case 0 сработало. Но я не смог заставить другие случаи работать, когда должна появиться ошибка.

На справочной странице chdir сказано, что при ошибках возвращается -1 и errno устанавливается соответствующим образом. Я тестировал на Linux и Windows 7, но ничего не получилось.

1 Ответ

4 голосов
/ 13 июня 2019

Я думаю, что вы спотыкаетесь о разнице между возвращаемым значением и errno.errno - глобальная переменная, объявленная в errno.h.То, что вы хотите, это что-то вроде:

#include <stdio.h>
#include <errno.h>

int main(void)
{
    char directory[100];
    scanf("%[^\n]", directory);

    if (chdir(directory) != 0) {
        switch (errno) {
          case EACCES:
            perror("\nError ");
            break;
          /*  ... */
        }
    }
}

Также немного странно, что в вашем коммутаторе есть куча дел, которые делают одно и то же ... Я предполагаю, что это потому, что они просто заглушки ивы действительно хотите по-разному обрабатывать разные ошибки в своем коде, но если нет, вы можете сбросить переключатель и просто сделать что-то вроде

if (chdir(directory) != 0) {
    perror("\nError ");
    exit(EXIT_FAILURE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...