Merge pull request #3580 from monishdeb/CRM-14701
[civicrm-core.git] / CRM / Core / TemporaryErrorScope.php
1 <?php
2
3 /**
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).
11 *
12 * To ensure that new errors arising during execution of the current
13 * function are immediately fatal, use:
14 *
15 * To ensure that they throw exceptions, use:
16 *
17 * @code
18 * $errorScope = CRM_Core_TemporaryErrorScope::useException();
19 * @endcode
20 *
21 * Note that relying on this is a code-smell: it can be
22 * safe to temporarily switch to exception
23 */
24 class CRM_Core_TemporaryErrorScope {
25 static $oldFrames;
26
27 public static function useException() {
28 $newFrame = array(
29 '_PEAR_default_error_mode' => PEAR_ERROR_CALLBACK,
30 '_PEAR_default_error_options' => array('CRM_Core_Error', 'exceptionHandler'),
31 'modeException' => 1,
32 );
33 return new CRM_Core_TemporaryErrorScope($newFrame);
34 }
35
36 public function __construct($newFrame) {
37 self::$oldFrames[] = self::getActive();
38 self::setActive($newFrame);
39 }
40
41 public function __destruct() {
42 $oldFrame = array_pop(self::$oldFrames);
43 self::setActive($oldFrame);
44 }
45
46 /**
47 * Read the active error-handler settings
48 */
49 public static function getActive() {
50 return array(
51 '_PEAR_default_error_mode' => $GLOBALS['_PEAR_default_error_mode'],
52 '_PEAR_default_error_options' =>$GLOBALS['_PEAR_default_error_options'],
53 'modeException' => CRM_Core_Error::$modeException,
54 );
55 }
56
57 /**
58 * Set the active error-handler settings
59 */
60 public static function setActive($frame) {
61 $GLOBALS['_PEAR_default_error_mode'] = $frame['_PEAR_default_error_mode'];
62 $GLOBALS['_PEAR_default_error_options'] = $frame['_PEAR_default_error_options'];
63 CRM_Core_Error::$modeException = $frame['modeException'];
64 }
65 }