我是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');
处理此问题的最佳方法是哪种?创建一个新的方法来处理异常?有关于如何做到这一点的任何例子吗?
最诚挚的问候。
答案 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()
代表“错误”或“成功”?一些替代方案:
trigger_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");
?>