Commit | Line | Data |
---|---|---|
6a488035 TO |
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 | ||
6a4257d4 TO |
27 | /** |
28 | * @return CRM_Core_TemporaryErrorScope | |
29 | */ | |
6a488035 | 30 | public static function useException() { |
6a4257d4 TO |
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 | |
77b97be7 EM |
43 | * @param null $modeException |
44 | * | |
6a4257d4 TO |
45 | * @return CRM_Core_TemporaryErrorScope |
46 | */ | |
47 | public static function create($callback, $modeException = NULL) { | |
6a488035 TO |
48 | $newFrame = array( |
49 | '_PEAR_default_error_mode' => PEAR_ERROR_CALLBACK, | |
6a4257d4 TO |
50 | '_PEAR_default_error_options' => $callback, |
51 | 'modeException' => $modeException, | |
6a488035 TO |
52 | ); |
53 | return new CRM_Core_TemporaryErrorScope($newFrame); | |
54 | } | |
55 | ||
a0ee3941 EM |
56 | /** |
57 | * @param $newFrame | |
58 | */ | |
6a488035 TO |
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 | public static function setActive($frame) { | |
84 | $GLOBALS['_PEAR_default_error_mode'] = $frame['_PEAR_default_error_mode']; | |
85 | $GLOBALS['_PEAR_default_error_options'] = $frame['_PEAR_default_error_options']; | |
86 | CRM_Core_Error::$modeException = $frame['modeException']; | |
87 | } | |
88 | } |