Конвертировать, если еще попробовать поймать - PullRequest
1 голос
/ 25 ноября 2010

Может кто-нибудь помочь мне в преобразовании следующего кода, написанного с использованием if-else для try / catch.Также дайте мне знать, необходим ли trycatch в этом случае, или если apt-100 *

$results = mysql_query($query);
if(mysql_num_rows($results)!=0)
{
    while(($result = mysql_fetch_row($results))!=FALSE)
    {
        $res   ="DELETE FROM table1 WHERE id ='".$result['id']."'";
        if(mysql_query($res)==false)
        {
            echo mysql_error();
            exit;
        }
    }
    echo $res   ="DELETE FROM table2 WHERE id ='".$id."'";
    if(mysql_query($res)!==false)
    {
        header("Location:list.php?m=4");
    }
    else
    {
        echo mysql_error();
        exit;
    }
}
else
{
    echo "Error";
}

Ответы [ 2 ]

5 голосов
/ 25 ноября 2010

try...catch имеет смысл только в том случае, если ваши функции генерируют исключения.Если они этого не сделают, то нет ничего для catch.Я бы начал с этого как рефакторинг:

$results = mysql_query($query);
if (!mysql_num_rows($results)) {
    echo 'No results!';
    exit;
}

$ids = array();
while (($result = mysql_fetch_row($results)) !== false) {
    $ids[] = $result['id'];
}

$ids = array_map('mysql_real_escape_string', $ids);
$query = "DELETE FROM table1 WHERE id IN ('" . join("','", $ids) . "')";
if (!mysql_query($query)) {
    echo mysql_error();
    exit;
}

$query = "DELETE FROM table2 WHERE id = '$id'";
if (!mysql_query($query)) {
    echo mysql_error();
    exit;
}

header("Location: list.php?m=4");
exit;

Это все еще можно улучшить, но это уже улучшение по сравнению с вашей логикой спагетти.Если вы серьезно заинтересованы в правильном использовании исключений, вы должны сначала перейти к правильному использованию функций для повторяющихся задач (таких как части error, exit), а затем, возможно, реструктурировать все это в классы и объекты и, наконец, использовать исключения для связи междутеперь вложенные слои.Возможно, начните использовать PHP-фреймворк, чтобы почувствовать все это.

Помещение исключений в приведенный выше код вряд ли будет больше, чем goto, но только для иллюстративных целей :

try {

    $results = mysql_query($query);
    if (!mysql_num_rows($results)) {
        throw new Exception('No results!');
    }

    $ids = array();
    while (($result = mysql_fetch_row($results)) !== false) {
        $ids[] = $result['id'];
    }

    $ids = array_map('mysql_real_escape_string', $ids);
    $query = "DELETE FROM table1 WHERE id IN ('" . join("','", $ids) . "')";
    if (!mysql_query($query)) {
        throw new Exception(mysql_error());
    }

    $query = "DELETE FROM table2 WHERE id = '$id'";
    if (!mysql_query($query)) {
        throw new Exception(mysql_error());
    }

    header("Location: list.php?m=4");
    exit;

} catch (Exception $e) {

    echo 'ERROR: ' . $e->getMessage();
    exit;

}
1 голос
/ 25 ноября 2010

от звука, кажется, вы думаете, что попробовать / поймать и если-еще как то же самое поведение. Это не относится к делу. Try catch используется для предотвращения аварийного сбоя приложения или для изящной обработки исключений, а также для ведения журнала и обратной связи с пользователем. If-else (else if) используется для проверки внутреннего состояния вашего приложения и выполнения различных действий соответственно.

Как правило, попытка перехвата менее эффективна, чем при подходе к решению проблемы или в другом случае.

...