1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
<?php
/**
* Exception classes file
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.pradosoft.com/
* @copyright Copyright © 2005-2014 PradoSoft
* @license http://www.pradosoft.com/license/
* @package Prado\Exceptions
*/
namespace Prado\Exceptions;
use Prado\Prado;
use Prado\TPropertyValue;
/**
* TException class
*
* TException is the base class for all PRADO exceptions.
*
* TException provides the functionality of translating an error code
* into a descriptive error message in a language that is preferred
* by user browser. Additional parameters may be passed together with
* the error code so that the translated message contains more detailed
* information.
*
* By default, TException looks for a message file by calling
* {@link getErrorMessageFile()} method, which uses the "message-xx.txt"
* file located under "System.Exceptions" folder, where "xx" is the
* code of the user preferred language. If such a file is not found,
* "message.txt" will be used instead.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @package Prado\Exceptions
* @since 3.0
*/
class TException extends \Exception
{
private $_errorCode='';
static $_messageCache=array();
/**
* Constructor.
* @param string error message. This can be a string that is listed
* in the message file. If so, the message in the preferred language
* will be used as the error message. Any rest parameters will be used
* to replace placeholders ({0}, {1}, {2}, etc.) in the message.
*/
public function __construct($errorMessage)
{
$this->_errorCode=$errorMessage;
$errorMessage=$this->translateErrorMessage($errorMessage);
$args=func_get_args();
array_shift($args);
$n=count($args);
$tokens=array();
for($i=0;$i<$n;++$i)
$tokens['{'.$i.'}']=TPropertyValue::ensureString($args[$i]);
parent::__construct(strtr($errorMessage,$tokens));
}
/**
* Translates an error code into an error message.
* @param string error code that is passed in the exception constructor.
* @return string the translated error message
*/
protected function translateErrorMessage($key)
{
$msgFile=$this->getErrorMessageFile();
// Cache messages
if (!isset(self::$_messageCache[$msgFile]))
{
if(($entries=@file($msgFile))!==false)
{
foreach($entries as $entry)
{
@list($code,$message)=explode('=',$entry,2);
self::$_messageCache[$msgFile][trim($code)]=trim($message);
}
}
}
return isset(self::$_messageCache[$msgFile][$key]) ? self::$_messageCache[$msgFile][$key] : $key;
}
/**
* @return string path to the error message file
*/
protected function getErrorMessageFile()
{
$lang=Prado::getPreferredLanguage();
$msgFile=Prado::getFrameworkPath().'/Exceptions/messages/messages-'.$lang.'.txt';
if(!is_file($msgFile))
$msgFile=Prado::getFrameworkPath().'/Exceptions/messages/messages.txt';
return $msgFile;
}
/**
* @return string error code
*/
public function getErrorCode()
{
return $this->_errorCode;
}
/**
* @param string error code
*/
public function setErrorCode($code)
{
$this->_errorCode=$code;
}
/**
* @return string error message
*/
public function getErrorMessage()
{
return $this->getMessage();
}
/**
* @param string error message
*/
protected function setErrorMessage($message)
{
$this->message=$message;
}
}
|