Use PHP exceptions for PEAR error handling.

Allows for the common try/catch construct, which makes error handling cleaner and easier.
This commit is contained in:
Craig Andrews 2010-03-01 21:40:42 -05:00
parent f9dd83caa7
commit d8212977ce
2 changed files with 63 additions and 46 deletions

View File

@ -37,8 +37,6 @@ define('INSTALLDIR', dirname(__FILE__));
define('STATUSNET', true); define('STATUSNET', true);
define('LACONICA', true); // compatibility define('LACONICA', true); // compatibility
require_once INSTALLDIR . '/lib/common.php';
$user = null; $user = null;
$action = null; $action = null;
@ -68,13 +66,15 @@ function getPath($req)
*/ */
function handleError($error) function handleError($error)
{ {
try {
if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) { if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
return; return;
} }
$logmsg = "PEAR error: " . $error->getMessage(); $logmsg = "PEAR error: " . $error->getMessage();
if (common_config('site', 'logdebug')) { if ($error instanceof PEAR_Exception && common_config('site', 'logdebug')) {
$logmsg .= " : ". $error->getDebugInfo(); $logmsg .= " : ". $error->toText();
} }
// DB queries often end up with a lot of newlines; merge to a single line // DB queries often end up with a lot of newlines; merge to a single line
// for easier grepability... // for easier grepability...
@ -83,13 +83,14 @@ function handleError($error)
// @fixme backtrace output should be consistent with exception handling // @fixme backtrace output should be consistent with exception handling
if (common_config('site', 'logdebug')) { if (common_config('site', 'logdebug')) {
$bt = $error->getBacktrace(); $bt = $error->getTrace();
foreach ($bt as $n => $line) { foreach ($bt as $n => $line) {
common_log(LOG_ERR, formatBacktraceLine($n, $line)); common_log(LOG_ERR, formatBacktraceLine($n, $line));
} }
} }
if ($error instanceof DB_DataObject_Error if ($error instanceof DB_DataObject_Error
|| $error instanceof DB_Error || $error instanceof DB_Error
|| ($error instanceof PEAR_Exception && $error->getCode() == -24)
) { ) {
$msg = sprintf( $msg = sprintf(
_( _(
@ -111,9 +112,17 @@ function handleError($error)
$dac = new DBErrorAction($msg, 500); $dac = new DBErrorAction($msg, 500);
$dac->showPage(); $dac->showPage();
} catch (Exception $e) {
echo _('An error occurred.');
}
exit(-1); exit(-1);
} }
set_exception_handler('handleError');
require_once INSTALLDIR . '/lib/common.php';
/** /**
* Format a backtrace line for debug output roughly like debug_print_backtrace() does. * Format a backtrace line for debug output roughly like debug_print_backtrace() does.
* Exceptions already have this built in, but PEAR error objects just give us the array. * Exceptions already have this built in, but PEAR error objects just give us the array.
@ -238,10 +247,6 @@ function main()
return; return;
} }
// For database errors
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
// Make sure RW database is setup // Make sure RW database is setup
setupRW(); setupRW();

View File

@ -71,6 +71,7 @@ if (!function_exists('dl')) {
# global configuration object # global configuration object
require_once('PEAR.php'); require_once('PEAR.php');
require_once('PEAR/Exception.php');
require_once('DB/DataObject.php'); require_once('DB/DataObject.php');
require_once('DB/DataObject/Cast.php'); # for dates require_once('DB/DataObject/Cast.php'); # for dates
@ -128,6 +129,17 @@ require_once INSTALLDIR.'/lib/activity.php';
require_once INSTALLDIR.'/lib/clientexception.php'; require_once INSTALLDIR.'/lib/clientexception.php';
require_once INSTALLDIR.'/lib/serverexception.php'; require_once INSTALLDIR.'/lib/serverexception.php';
//set PEAR error handling to use regular PHP exceptions
function PEAR_ErrorToPEAR_Exception($err)
{
if ($err->getCode()) {
throw new PEAR_Exception($err->getMessage(), $err->getCode());
}
throw new PEAR_Exception($err->getMessage());
}
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'PEAR_ErrorToPEAR_Exception');
try { try {
StatusNet::init(@$server, @$path, @$conffile); StatusNet::init(@$server, @$path, @$conffile);
} catch (NoConfigException $e) { } catch (NoConfigException $e) {