Merge pull request #11679 from jitendrapurohit/CRM-21776
[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 /**
28 * @return CRM_Core_TemporaryErrorScope
29 */
30 public static function useException() {
31 return self::create(array('CRM_Core_Error', 'exceptionHandler'), 1);
32 }
33
34 /**
35 * @return CRM_Core_TemporaryErrorScope
36 */
37 public static function ignoreException() {
38 return self::create(array('CRM_Core_Error', 'nullHandler'));
39 }
40
41 /**
42 * @param mixed $callback
43 * @param null $modeException
44 *
45 * @return CRM_Core_TemporaryErrorScope
46 */
47 public static function create($callback, $modeException = NULL) {
48 $newFrame = array(
49 '_PEAR_default_error_mode' => PEAR_ERROR_CALLBACK,
50 '_PEAR_default_error_options' => $callback,
51 'modeException' => $modeException,
52 );
53 return new CRM_Core_TemporaryErrorScope($newFrame);
54 }
55
56 /**
57 * @param $newFrame
58 */
59 public function __construct($newFrame) {
60 self::$oldFrames[] = self::getActive();
61 self::setActive($newFrame);
62 }
63
64 public function __destruct() {
65 $oldFrame = array_pop(self::$oldFrames);
66 self::setActive($oldFrame);
67 }
68
69 /**
70 * Read the active error-handler settings
71 */
72 public static function getActive() {
73 return array(
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,
77 );
78 }
79
80 /**
81 * Set the active error-handler settings
82 *
83 * @param string $frame
84 */
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'];
89 }
90
91 }