Корректная Структура для проверки ошибок в использовании NSError

function populateDropdown(select, data) {   
    select.html('');   
    $.each(data, function(id, option) {   
        select.append($('').val(option.value).html(option.name));   
    });          
}   

Хорошо работает с jQuery 1.4.1.

Полный текст статьи об использовании динамических списков с ASP.NET MVC & amp; jQuery посещение: http://www.codecapers.com/post/Dynamic-Select-Lists-with-MVC-and-jQuery.aspx

9
задан John Gallagher 26 June 2009 в 14:39
поделиться

3 ответа

Примечание: Когда я опубликовал это, я не знал ни о каких дискуссиях об исключениях для MacOS / Какао. Помните об этом, когда будете обдумывать этот ответ.

Почему бы вместо этого не использовать исключения ? Это позволит вам обойтись без параметра error в ваших методах и обрабатывать ошибки в одном месте.

-(IBAction)buttonPress:(id)sender {
    // Create Document Shopping List with this document
    @try {
        [self doSomething];
        [self doSomethingElse];
        [self doYetSomethingElse];
    } @catch (NSException* e) {
        [NSApp presentException:e];
    }
    return nil;
}

Вам, конечно же, нужно будет генерировать исключения по мере необходимости из ваших методов doXXXX:

NSException* e = [NSException exceptionWithName:@"MyException"
                                         reason:@"Something bad happened"
                                       userInfo:nil];
@throw e;
0
ответ дан 4 December 2019 в 14:30
поделиться

Я думаю, что реальный вопрос заключается в том, какая степень детализации вам нужна при обработке ошибок. Ваш код в основном правильный, но вы можете исправить ситуацию, реже проверяя наличие ошибок или используя комплексный подход, такой как teabot, упомянутый в его ответе с NSException. Многие встроенные функции, возвращающие ошибки (например, moveItemAtPath из NSFileManager :), возвращают BOOL в дополнение к предоставлению объекта NSError, поэтому вы также можете использовать вложенные операторы if, если вам не нужна информация NSError.

Тем не менее, на самом деле нет отличного способа сделать это. Если ваш код длинный, KVO может быть отличным решением. Однако я никогда не пробовал это делать в такой ситуации.

1
ответ дан 4 December 2019 в 14:30
поделиться

Суть вашего вопроса заключается в том, можно ли внести структурные улучшения в обработку ошибок. Я так думаю, по сути, путем введения большего количества уровней вложенности, либо путем выделения большего количества кода в отдельные методы / функции, либо путем введения вложенности в свой метод выборки высокого уровня.

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

Используя эту идею «распространить или обработать», я бы перепишите пример метода следующим образом:

-(IBAction)buttonPress:(id)sender {

    // Create Document Shopping List with this document
    [self doSomething:&error];    
    if(error == nil) {
        [self doSomethingElse:&error];
        if (error == nil) {
            [self doYetSomethingElse:&error];
        }
    }

    if(error) {
        [NSApp presentError:&error];
    }    
}

Обратите внимание, что есть веские аргументы против слишком большого количества вложений в конкретный метод. Подобное вложение - это, по сути, короткая альтернатива методам извлечения. Это могло бы иметь больше смысла, например, что "doSomething:" сам вызывает doSomethingElse :, который, например, вызывает doYetSomethingElse :. Это наложит ту же структуру на код, что и if-nest, но, возможно, будет более удобным в обслуживании.

Кстати, я не поклонник встроенных операторов return. В этом конкретном случае примерный метод на самом деле не вызывает возвращаемое значение, но если это так, я предпочитаю устанавливать локальную переменную на возвращаемое значение и возвращать только в конце управления потоком. Преждевременный выход из функции или метода - верный способ столкнуться со странными ошибками, ИМХО.

Это наложит ту же структуру на код, что и if-nest, но, возможно, будет более удобным в обслуживании.

Кстати, я не поклонник встроенных операторов return. В этом конкретном случае примерный метод на самом деле не вызывает возвращаемое значение, но если это так, я предпочитаю устанавливать локальную переменную на возвращаемое значение и возвращать только в конце управления потоком. Преждевременный выход из функции или метода - верный способ столкнуться со странными ошибками, ИМХО.

Это наложит ту же структуру на код, что и if-nest, но, возможно, будет более удобным в обслуживании.

Кстати, я не поклонник встроенных операторов return. В этом конкретном случае примерный метод на самом деле не вызывает возвращаемое значение, но если это так, я предпочитаю устанавливать локальную переменную на возвращаемое значение и возвращать только в конце управления потоком. Преждевременный выход из функции или метода - верный способ столкнуться со странными ошибками, ИМХО.

Я предпочитаю устанавливать для локальной переменной возвращаемое значение и возвращаться только в конце управления потоком. Преждевременный выход из функции или метода - верный способ столкнуться со странными ошибками, ИМХО.

Я предпочитаю устанавливать для локальной переменной возвращаемое значение и возвращаться только в конце управления потоком. Преждевременный выход из функции или метода - верный способ столкнуться со странными ошибками, ИМХО.

2
ответ дан 4 December 2019 в 14:30
поделиться