NSFileHandle writeData: обработка исключений

Это может быть довольно широкой проблемой, но я не смог найти ни одного интернет-ресурса, который бы разрешал или объяснял этот вопрос.

Вопрос после создания NSFileHandle *writer = [NSFileHandle fileHandleForWritingAtPath:"path"] и когда вы используете [writer writedata:"NSData"] Есть синус возможное исключение, которое может сработать в соответствии с Apple Doc.

"Этот метод вызывает исключение, если файловый дескриптор закрыт или недействителен, если получатель представляет неподключенную конечную точку канала или сокета, если в файловой системе не осталось свободного места или если произошла какая-либо другая ошибка записи". - APPLE DOC

Все, что я хочу знать, это то, что мы можем как-то обработать или проверить эти проблемы, не используя попытку catch или проверку каждой ошибки в проверке состояния перед записью. Любой возможный способ, которым мы можем использовать NSError справиться с этим?

1 ответ

Решение

Я бы сказал "Нет". Если вам удалось найти тест, который охватывал все возможные сбои перед записью, то нечего сказать, что операция записи может завершиться неудачно после этого начального теста (подумайте о записи в файловую систему с 1 КБ свободной и вы хотите записать 4 КБ).

Поэтому обернуть ваши вызовы этих методов внутри @try/@catch блок кажется мне лучшим подходом. Эти обертки могут затем вернуть NSError ** если вы хотите получить подробную информацию о сбое (что вы, безусловно, должны хотеть).

- (BOOL)writeData:(NSData *)data
     toFileHandle:(NSFileHandle *)fileHandler
            error:(NSError **)error
{
    @try
    {
        [fileHandler writeData:data];
    }
    @catch (NSException *e)
    {
        if (error != NULL)
        {
            NSDictionary *userInfo = @{ 
                NSLocalizedDescriptionKey : @"Failed to write data",
                // Other stuff?
            };
            *error = [NSError errorWithDomain:@"MyStuff" code:123 userInfo:userInfo];
        }
        return NO;
    }
    return YES;
}

Вы наверняка захотите узнать причину неудачи в NSError, но для меня не сразу очевидно, как это сделать.

Другие вопросы по тегам