Как я должен обработать ошибки в методах Perl, и что я должен возвратить из методов?

Вместо того, чтобы обращаться к UISwitch через ваш аргумент sender, вы переходите непосредственно к тому, что, как я полагаю, является значением IBOutlet. Вместо этого вы можете получить доступ к отправителю, как описано ниже:

@IBAction func userDidSelectVisibiltySwitch(_ sender: UISwitch) {
    if sender.isOn && badCondition {
        sender.setOn(false, animated: false)
    } else { // In this case it is normal, it does not execute the else {}
        // work to be done if the user has turned off the switch
    }
}

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

Я также пошел дальше и объединил ваше утверждение if, поскольку предоставленный вами образец не требует вложенной проверки.

ОБНОВЛЕНО НА ОСНОВЕ КОММЕНТАРИИ РМАДДИ

Это решение вызвало у меня немного запаха кода, и после дальнейшего изучения я смог воспроизвести сценарии, описанные ОП. Это было достигнуто установкой действия в раскадровке, как показано здесь:

enter image description here

С этой настройкой я увидел следующее:

[ 1122]

  • Исходный код, отправленный OP, потерпит неудачу
  • Добавление DispatchQueue, как продемонстрировано OP, исправит переключение после небольшой задержки
  • Мое опубликованное решение будет работать правильно
  • [1122 ]

    Предполагая, что это то, что сделал OP, тогда первое исправление будет состоять в том, чтобы изменить событие на Value Changed. Тогда, как заявил rmaddy в комментарии, это будет успешным независимо от того, используете ли вы аргумент или IBOutlet. Исходя из первоначального вопроса, моя интерпретация заключалась в том, что возникла проблема с выходным значением и состоянием синхронизации в интерфейсе.

    5
    задан brian d foy 10 January 2009 в 02:21
    поделиться

    4 ответа

    Если Вы знакомы за исключениями из языков как Java, то думаете die как throw и eval как try и catch. Вместо возврата undef, Вы могли сделать что-то вроде этого:

    if ($self->{ssh}->waitfor($response, $self->{CMD_TIMEOUT}, '-re')) {
        return {
            before => $self->{ssh}->before(),
            match => $self->{ssh}->match(),
            after => $self->{ssh}->after(),
        };
    }
    
    die "ERROR: '$cmd' response did not match /$response/:\n\n" 
    . $self->{ssh}->before();
    

    Затем в Вашем коде вызова:

    eval { 
        $ilo->command("set oemhp_server_name=$system_name", 'status=0');
    };
    
    if ( my $error = $@ ) { 
        # handle $error here
    }
    

    Точно так же, как исключения на других языках это позволяет Вам залогу из подметода в любой точке, не имея необходимость волновать по поводу распространения возвращаемых значений стек вызовов. Они будут пойманы первым eval блок, который находит их. Кроме того, Вы можете die снова для переброска исключения Вы не можете иметь дело с, создают резервную копию стека.

    Еще лучше можно использовать die бросить объект, который Ваш обработчик исключений может опросить для полезной информации и сообщений об ошибках. Мне нравится использовать Исключение:: Класс с этой целью. Ошибочный модуль обеспечивает немного синтаксического сахара для того, чтобы сделать подобные Java блоки попытки/выгоды, также.

    5
    ответ дан 18 December 2019 в 13:20
    поделиться

    Обычный способ повысить исключения в Perl с, умирают. Обычный способ поймать их использует оценку с блоком как аргумент и тестирует $ после того, как оценка закончится.

    5
    ответ дан 18 December 2019 в 13:20
    поделиться

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

    if (!$ilo->commandSucceeded("set oemhp_server_name=$system_name", 'status=0')) {
         #recover here
    }
    

    Конечно, внутренняя реализация команды () становится

    die ... if !commandSucceeded;
    
    0
    ответ дан 18 December 2019 в 13:20
    поделиться

    Вы найдете большое обсуждение этого вида вещи в googlespace. Лучшая практика, независимо от того, что Вы решаете, не должна перегружать ни одно из значений, таким образом, возвращаемое значение означает разные вещи. Это должен всегда быть код ошибки, или это никогда не должен быть код ошибки. Людям не придется посмотреть на фактическое значение, чтобы решить, является ли это код ошибки или нет.

    Проверьте популярные модули Perl на CPAN (или те Вы уже используете) видеть то, что они делают. Я даже говорю об этом немного в Освоении Perl, но я не даю черно-белый ответ. Как со всем реальным кодом, реальный ответ, "Он зависит".

    Существует много различных способов сделать это. К сожалению, это означает, что люди делают это каждым способом. Так как это имеет место, я вызываю непротиворечивость как главное правило. Что большая часть кода уже делает (не подсчет неправильного пути)? Если я должен вписаться в существующую кодовую базу, я пытаюсь использовать тот же вид интерфейса, который уже использует большая часть кода.

    Если нет никакого явного победителя, запишите варианты использования с помощью нескольких различных стилей. Какой соответствует проблеме лучше или более естественно выражает шаги, которые сделает большинство пользователей? Это не всегда просто читает для die и eval. Запишите демонстрационные сценарии с помощью нереализованных интерфейсов. Какой стиль Вы собираетесь хотеть использовать? Я нашел, что на самом деле запись сценария, прежде чем я реализую интерфейс, показывает мне намного больше, чем я думал о. Если я пишу материал для других людей для использования, я показываю им сценарии в различных стилях и спрашиваю их, какой они любят лучше.

    И, если все это сбои, достигните 2d6.:)

    4
    ответ дан 18 December 2019 в 13:20
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: