Как конвертировать код iPhone OSStatus во что-то полезное? - PullRequest
62 голосов
/ 04 февраля 2010

Мне более чем надоел этот iPhone SDK и его документация ...

Я звоню AudioConverterNew

в документации под Returns: написано "возвращает код состояния" ... на самом деле ...

До сих пор, играя с параметрами, я смог получить только две разные ошибки, ни одна из которых не указана в нижней части справочника Audio Converter.

это 'mrep' и '? Tmf' (приведение OSStatus к массиву символов), но конкретные коды на самом деле не имеют значения.

Насколько я могу судить, случайные коды ошибок определены в случайных файлах, поэтому вы не можете просто найти один файл, я не могу найти справочный документ, который просто позволяет вам искать код ошибки, чтобы получить больше информации и из того, что я могу сказать, в OS X вы можете использовать GetMacOSStatusErrorString (), чтобы преобразовать ошибку во что-то полезное, но нет эквивалента iPhone?

любая помощь будет принята с благодарностью.

EDIT:

хорошо, поэтому приведение к ним дает их в обратном порядке (что-то, что я проверил на «mrep», но не было в любом случае), fmt? находится в списке для Audio Converter api, и довольно понятен, если немного расплывчатый, но достаточно справедливый, все еще «perm» не существует (хотя это может быть что-то связанное с симулятором, не поддерживающим декодирование aac) общий вопрос все еще стоит.

Ответы [ 19 ]

88 голосов
/ 21 июня 2012

OSStatus является целочисленным значением со знаком. Вы не можете преобразовать или «привести» его к строке. Вы можете преобразовать его в NSError следующим образом:

NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];

30 голосов
/ 04 февраля 2010

Нет. Не полностью.

Некоторые OSStatus представляют собой четырехсимвольные коды, поэтому вы можете использовать (извлечено из примера кода iPhone SDK "CAXException.h")

static char *FormatError(char *str, OSStatus error)
{
    // see if it appears to be a 4-char-code
    *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error);
    if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
        str[0] = str[5] = '\'';
        str[6] = '\0';
    } else {
        // no, format it as an integer
        sprintf(str, "%d", (int)error);
    }
    return str;
}

(См. iOS / C: преобразовать "целое число" в строку из четырех символов , чтобы узнать о некоторых других способах преобразования fourcc в строку, включая Swift)

NSOSStatusErrorDomain NSError способен декодировать некоторые ошибки ОС. См. @ Томк ответ .

Если вам не нужно декодировать номер в программе для пользователя, вы можете использовать скрипт macerror, чтобы вручную выяснить значение, как указано в ответе @ lros . Список поддерживаемых OSStatus можно найти в его исходном коде в /System/Library/Perl/Extras/5.18/Mac/Errors.pm.

Существует также онлайн-сервис http://osstatus.com/, собирающий ошибки из всех общедоступных платформ. Они еще не совсем завершены, например сопоставление с -12792, упомянутое в комментарии, отсутствует. Вероятно, это код из частного фреймворка.

13 голосов
/ 18 апреля 2014

Недавно я столкнулся с другим подходом: командой macerror. Распечатайте значение OSStatus в виде целого числа со знаком. Затем в окне терминала (на вашем Mac, а не на iDevice!) Введите, например, macerror -50 . Это ответит с кратким описанием. Очевидно, это полезно только вам, во время разработки.

11 голосов
/ 07 августа 2012

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

10 голосов
/ 13 июня 2013

Доступно для macOS и iOS от 11.3 и выше.

Я знаю, что это старый пост, но я читал документацию по яблоку в разделе, связанном с брелками Они упоминают метод, который используется для преобразования ошибок OSStatus во что-то читаемое.

SecCopyErrorMessageString

Возвращает строку, объясняющую смысл кода результата безопасности.

SecCopyErrorMessageString (статус OSStatus, void * зарезервировано);

Использование:

NSString* ErrMsg = (__bridge_transfer NSString *) SecCopyErrorMessageString(theOSStatusError, NULL);

Это сработало для меня с ошибками OSStatus в связке ключей. Работает ли это для вас? Вам потребуется Security.Framework , добавленный в ваш проект, чтобы использовать этот метод.

4 голосов
/ 24 сентября 2015

Я недавно нашел этот действительно хороший сайт, который работает для каждого значения статуса, которое я выбрасывал.Это намного удобнее для пользователя, чем просмотр файлов заголовков фреймворка: http://www.osstatus.com/

4 голосов
/ 21 октября 2013

Используйте программу OSX calc.Выберите режим «программист» в меню презентации.Затем введите свой код в десятичном представлении.Затем нажмите кнопку «ascii», и calc покажет вам перевод на 4 символа, такой как «! Init», «! Cat» и т. Д.

4 голосов
/ 27 июля 2018

Я объединил несколько ответов. На самом деле я искал что-то вроде «throw errorForStatusCode (status)». Но в итоге достигнуто:

    guard status == errSecSuccess else {
        throw  NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: [NSLocalizedDescriptionKey: SecCopyErrorMessageString(status, nil) ?? "Undefined error"])
    }

SecCopyErrorMessageString доступна из iOS 11.3 https://developer.apple.com/documentation/security/1542001-security_framework_result_codes

2 голосов
/ 09 августа 2013

В большинстве случаев, может быть, вам просто нужно найти код ошибки в файлах .h

Я просто создал скрипт Python для поиска кода (когда вы отлаживаете / печатаете код osstatus)

https://github.com/sprhawk/MyGist/blob/master/tools/find_osstatus_error.py

2 голосов
/ 08 января 2015

Если строка описания отсутствует, удобно конвертировать значения OSStatus в строки, которые выглядят как их четырехсимвольные определения. По крайней мере, тогда вы можете получить заголовки в надежде найти комментарий о том, что означает статус.

// declaration:  extern CFStringRef CreateTypeStringWithOSType(OSType inType);

OSStatus result = ...;

if (result != noErr) {
    NSString *statusString = (NSString *)CreateTypeStringWithOSType(result);
    NSLog(@"Error while $VERBing: %@", statusString);
    [statusString release]; // because "Create..."
    statusString = nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...