4 * This is an evil, evil work-around for CRM-11043. It is used to
5 * temporarily change the error-handling behavior and then automatically
6 * restore it -- that protocol is an improvement over the current protocol
7 * (in which random bits of code will change the global error handler
8 * setting and then forget to change it back). This class and all
9 * references to it should be removed in 4.3/4.4 (when we adopt
10 * exception-based error handling).
12 * To ensure that new errors arising during execution of the current
13 * function are immediately fatal, use:
15 * To ensure that they throw exceptions, use:
18 * $errorScope = CRM_Core_TemporaryErrorScope::useException();
21 * Note that relying on this is a code-smell: it can be
22 * safe to temporarily switch to exception
24 class CRM_Core_TemporaryErrorScope
{
25 public static $oldFrames;
28 * @return CRM_Core_TemporaryErrorScope
30 public static function useException() {
31 return self
::create(['CRM_Core_Error', 'exceptionHandler'], 1);
35 * @return CRM_Core_TemporaryErrorScope
37 public static function ignoreException() {
38 return self
::create(['CRM_Core_Error', 'nullHandler']);
42 * @param mixed $callback
43 * @param null $modeException
45 * @return CRM_Core_TemporaryErrorScope
47 public static function create($callback, $modeException = NULL) {
49 '_PEAR_default_error_mode' => PEAR_ERROR_CALLBACK
,
50 '_PEAR_default_error_options' => $callback,
51 'modeException' => $modeException,
53 return new CRM_Core_TemporaryErrorScope($newFrame);
59 public function __construct($newFrame) {
60 self
::$oldFrames[] = self
::getActive();
61 self
::setActive($newFrame);
64 public function __destruct() {
65 $oldFrame = array_pop(self
::$oldFrames);
66 self
::setActive($oldFrame);
70 * Read the active error-handler settings
72 public static function getActive() {
74 '_PEAR_default_error_mode' => $GLOBALS['_PEAR_default_error_mode'],
75 '_PEAR_default_error_options' => $GLOBALS['_PEAR_default_error_options'],
76 'modeException' => CRM_Core_Error
::$modeException,
81 * Set the active error-handler settings
83 * @param string $frame
85 public static function setActive($frame) {
86 $GLOBALS['_PEAR_default_error_mode'] = $frame['_PEAR_default_error_mode'];
87 $GLOBALS['_PEAR_default_error_options'] = $frame['_PEAR_default_error_options'];
88 CRM_Core_Error
::$modeException = $frame['modeException'];