Решить вложенные условные (ошибки) уровни в php - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь разрешить вложенные условные уровни в php, связанные с обработкой ошибок.

Я уже прочитал некоторые вопросы и ответы здесь, например, для выравнивания вещей.

Но ... Представьте себе что-то вроде функции

function my_function() {

    // 1. Doing things here
    // ...


    // 2. Handle something with text here
    $foo = 'some text ...';

    $foo = function_a($foo); // Handling the text, doing something, returning FALSE in case of error

    $foo = function_b($foo); // Also handling the text, doing something, returning FALSE in case of error

    // Final functions doing things with the text


    // 3. Doing other things here

    return TRUE;

}

Чтобы все сделать правильно, я должен выполнить обработку ошибок:

function my_function() {

    // 1. Doing things here
    // ...


    // 2. Handle something with text here
    $foo = 'some text ...';

    $foo = function_a($foo); // Handling the text, doing something, returning FALSE in case of error
    if (FALSE === $foo) {
        // Handle error, e.g. skip to next flow after code block
    }

    $foo = function_b($foo); // Also handling the text, doing something, returning FALSE in case of error
    if (FALSE === $foo) {
        // Handle error, e.g. skip to next flow after code block
    }

    // Final functions doing things with the text


    // 3. Doing other things here

    return TRUE;

}   

Может быть, вы уже видите мою проблему: обработка ошибок потребует от меня вложенности if s

    $foo = function_a($foo); // Handling the text, doing something, returning FALSE in case of error
    if (FALSE === $foo) {
        // Handle error, e.g. skip to next flow after code block
    }
    else {
        $foo = function_b($foo); // Also handling the text, doing something, returning FALSE in case of error
        if (FALSE === $foo) {
            // Handle error, e.g. skip to next flow after code block
        }
        else {
            // Final functions doing things with the text
        }
    }

для выполнения финальных функций, поскольку возврат из функции НЕ является опцией (шаг 3 должен выполняться независимо от того, что в 2. произойдет).

есть идеи, как "сгладить" эти вложенные условные выражения?

1 Ответ

0 голосов
/ 14 января 2020

Вы можете немного изменить дизайн кода и просто рано вернуться из своей функции:

function my_function() {  
    $foo = function_a($foo); // Handling the text, doing something, returning FALSE in case of error
    if (FALSE === $foo) {
        // Handle error, e.g. skip to next flow after code block
        return FALSE;
    }

    $foo = function_b($foo); // Also handling the text, doing something, returning FALSE in case of error
    if (FALSE === $foo) {
        // Handle error, e.g. skip to next flow after code block
        return FALSE;
    }

    // Final functions doing things with the text
    return TRUE;
}

function outer_function() {
    $result = my_function()

    // 3. Doing other things here

    // Do things with $result
}

Другой способ справиться с этим - использовать try - catch - finally block.

function my_function() {  
    try {
        $foo = function_a($foo); // Handling the text, doing something, returning FALSE in case of error
        if (FALSE === $foo) { throw new Exception('function_a failed'); }

        $foo = function_b($foo); // Also handling the text, doing something, 
        if (FALSE === $foo) { throw new Exception('function_b failed'); }
    } catch (Exception $e) {
        // Handle error, e.g. skip to next flow after code block
        // echo error messages
        return FALSE;
    } finally {
        // Final functions doing things with the text whether successful or not
    }
    // 3. Doing other things here if all successful
    return TRUE;
}

Мне нравится 2-й способ лучше, потому что он чувствует себя чище, и оператор finally выполнит до , возвращая FALSE если есть ошибка Вы можете избежать операторов throw, если ваши внутренние функции сами вызывают исключения и объединяют всю обработку ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...