PHP中的错误处理。怎么做?

时间:2010-12-22 14:08:49

标签: php error-handling

我是PHP OOP的初学者,我对在PHP中处理错误的正确方法有些怀疑。

请看这个函数,例如:

public function deleteFileFromDisk($fileNameToBeDeleted) {

    $handle = unlink($fileNameToBeDeleted);

    if (!$handle) {
        $result = "(this->deleteFileFromDisk) - Error, " . $fileNameToBeDeleted . " not deleted.";
    } else {
        $result = "(this->deleteFileFromDisk) - Success, " . $fileNameToBeDeleted . " deleted.";
    }
    return $result;
}

这是正确的做法,还是我可以做得更好?

让我补充一些我正在实现的细节......

我正在运行类方法,我需要控制进程中的错误。如果对该对象的任何调用抛出错误,我需要捕获它并发送电子邮件。

以下是对象互动:

$testar_classe = new geoIpImportCSV('geolitecity', 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/');
$testar_classe->downloadAndSaveFile('./', $testar_classe->obtainDownloadFileName());
$testar_classe->uncompressZipFile($testar_classe->obtainDownloadFileName(), '.');
$testar_classe->deleteLine(1, 'GeoLiteCity-Location.csv');               
$testar_classe->deleteLine(1, 'GeoLiteCity-Blocks.csv');
$testar_classe->deleteDataFromTable('tabela1');
$testar_classe->deleteDataFromTable('tabela2');
$testar_classe->insertLinesToDb('GeoLiteCity-Location.csv', 'tabela1');
$testar_classe->insertLinesToDb('GeoLiteCity-Blocks.csv', 'tabela2');
$testar_classe->deleteFileFromDisk($testar_classe->obtainDownloadFileName());
$testar_classe->deleteFileFromDisk('GeoLiteCity-Blocks.csv');
$testar_classe->deleteFileFromDisk('GeoLiteCity-Location.csv'); 

处理此问题的最佳方法是哪种?创建一个新的方法来处理异常?有关于如何做到这一点的任何例子吗?

最诚挚的问候。

6 个答案:

答案 0 :(得分:2)

你在这里做的事情(将一个字符串作为成功/失败指标返回)真是个坏主意。问题是像这样的字符串只适合呈现给人类;当它们需要知道是否存在故障时,它们对您的代码绝对无用,如果是,则如何处理它。

阅读以下相关问题:

答案 1 :(得分:2)

尝试查看exceptions

public function deleteFileFromDisk($fileNameToBeDeleted) {

    $handle = unlink($fileNameToBeDeleted);

    if (!$handle) {
        throw new Exception("(this->deleteFileFromDisk) - Error, " . $fileNameToBeDeleted . " not deleted.";
    } 
}

然后在代码中:

try {
    $object->deleteFileFromDisk('blabla');
}
catch (Exception $e) {
    echo $e->message;
}

答案 2 :(得分:2)

这种方法可能会给你带来一些麻烦。例如,如果您想以编程方式检测函数是否成功,该怎么办? strpos()代表“错误”或“成功”?一些替代方案:

  1. 对于简单的成功/失败案例,返回布尔值true / false。
  2. 当出现问题时,
  3. Throw exceptionstrigger_error()
  4. 返回一个特殊的错误容器类la WP_Error,并检查函数的返回值是否是此类的实例。

答案 3 :(得分:1)

在OOP方式中,错误处理 主要用exceptions完成。在特殊情况下应该例外,例如,如果不满足条件,或者如果出现意外情况,则程序或例程无法继续进行。

在上面的示例中,不需要例外。但是,返回一个包含一条消息的字符串,该消息表明它是否有效是很糟糕的,因为它要求该方法的用户解析该字符串以确定它是否有效。

您的方法有两种可能的结果:它工作(true),或者没有(false)。由于你的方法只是从磁盘中删除一个文件而不再继续,所以返回一个布尔值就好了。

如果在其工作流程中必须删除文件,那么使用deleteFromDisk的例程可能会抛出异常:

$file = 'foo/bar.txt';
if (!$this->deleteFromDisk($file)) {
   throw new Exception('Directory could not be removed: cannot delete '.$file.' from disk');
}

rmdir('foo/');

在上面的示例中,删除文件对于下一个语句是必须的,因此使用异常是正确的。

答案 4 :(得分:0)

我建议研究exceptions in PHP的概念。它使代码更清晰,并且比任何地方的if..else语句都更强大。

在您的特定情况下,如果删除文件失败,我只会在您的函数中抛出异常,然后在其他地方的try..catch语句中使用它。

答案 5 :(得分:-1)

创建示例文件夹并将以下代码保存为 error.php 并在示例中创建文件夹错误创建空txt文件错误日志.TXT

<?php
function error_msg($err_type,$err_msg,$err_file,$err_line)
{
$fh=fopen("error/errorlog.txt","a");
$date1=date("Y-m-d H:i:s");
$er="
===============================================================================================================
"."
Error: Type: ".$err_type."Message: ".$err_msg."ErrorFile: ".$err_file."Errorline: ".$err_line."Time: ".$date1.
"
===============================================================================================================
";
fwrite($fh,$er);
fclose($fh);
}

//set_error_handler("error_msg");
function handler($err_type,$err_msg,$err_file,$err_line)
{
    switch($err_type)
    {
        //fatal error
    case E_ERROR:
        $fh=fopen("error/errorlog.txt","a");
        $date1=date("Y-m-d H:i:s");
        $er="
        ===============================================================================================================
        "."
        Error: Type: ".$err_type."Message: ".$err_msg."ErrorFile: ".$err_file."Errorline: ".$err_line."Time: ".$date1.
        "
        ===============================================================================================================
        ";
        fwrite($fh,$er);
        fclose($fh);
        break;
        //warnings
    case E_WARNING:
        $fh=fopen("error/errorlog.txt","a");
        $date1=date("Y-m-d H:i:s");
        $er="
        ===============================================================================================================
        "."
        Error: Type: ".$err_type."Message: ".$err_msg."ErrorFile: ".$err_file."Errorline: ".$err_line."Time: ".$date1.
        "
        ===============================================================================================================
        ";
        fwrite($fh,$er);
        fclose($fh);
        break;
        //notices
    case E_NOTICE:
        //
        break;

    }
}

set_error_handler("handler");
?>