我正在试图弄清楚在PHP中处理错误的方法是否比我在下面做的更好或更好。如果parse_ini_file
调用出现问题,我想抛出异常。这有效,但是有更优雅的方法来处理错误吗?
public static function loadConfig($file, $type)
{
if (!file_exists($file))
{
require_once 'Asra/Core/Exception.php';
throw new Asra_Core_Exception("{$type} file was not present at specified location: {$file}");
}
// -- clear the error
self::$__error = null;
// -- set the error handler function temporarily
set_error_handler(array('Asra_Core_Loader', '__loadConfigError'));
// -- do the parse
$parse = parse_ini_file($file, true);
// -- restore handler
restore_error_handler();
if (!is_array($parse) || is_null($parse) || !is_null(self::$__error))
{
require_once 'Asra/Core/Exception.php';
throw new Asra_Core_Exception("{$type} file at {$file} appears to be
}
}
__ loadConfigError
函数只将__error
设置为错误字符串:
private static function __loadConfigError($errno, $errstr, $errfile, $errline)
{
self::$__error = $errstr;
}
谢谢!
答案 0 :(得分:5)
我通常会安装一个全局错误处理程序来将错误转换为异常:
function exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
return;
}
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
set_error_handler('exceptions_error_handler');
对于极少数情况,我实际上想要收集一堆警告,我暂时关闭上面的处理程序。它在课堂上很好地打包了:
/**
* Executes a callback and logs any errors.
*/
class errorhandler_LoggingCaller {
protected $errors = array();
function call($callback, $arguments = array()) {
set_error_handler(array($this, "onError"));
$orig_error_reporting = error_reporting(E_ALL);
try {
$result = call_user_func_array($callback, $arguments);
} catch (Exception $ex) {
restore_error_handler();
error_reporting($orig_error_reporting);
throw $ex;
}
restore_error_handler();
error_reporting($orig_error_reporting);
return $result;
}
function onError($severity, $message, $file = null, $line = null) {
$this->errors[] = $message;
}
function getErrors() {
return $this->errors;
}
function hasErrors() {
return count($this->errors) > 0;
}
}