代码之家  ›  专栏  ›  技术社区  ›  aWebDeveloper

转换if else以尝试catch

  •  1
  • aWebDeveloper  · 技术社区  · 14 年前

    有人能帮我把下面用if-else编写的代码转换成try/catch吗。同时让我知道在这种情况下是否需要尝试匹配,或者是否合适

    $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 回复  |  直到 14 年前
        1
  •  1
  •   Runar Halse    14 年前

    从它的声音来看,你似乎认为try/catch和if-else是相同的行为。事实并非如此。Try catch用于防止异常导致应用程序崩溃或优雅地处理异常,并执行日志记录和提供用户反馈。If else(else If)用于检查应用程序的内部状态,并相应地执行不同的操作。

    一般来说,try-catch的效率比有switch case或其他方法解决问题的效率低。

        2
  •  5
  •   Zul    9 年前

    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;
    
    }