异常时会调用 $e->getTraceAsString(); 而这个函数会把参数长度超过15个字符的截断掉,变成 “…”
if (Z_STRLEN_PP(arg) > 15) {
TRACE_APPEND_STRL(Z_STRVAL_PP(arg), 15); //这里会截取前15个字符
TRACE_APPEND_STR("...', ");
l_added = 15 + 6 + 1; /* +1 because of while (--l_added) */
}
网上找 了个方法可以解决这个问题,先把 getExceptionTraceAsString()放入function.php里,然后打开Think.class.php到226左右,
把$error[‘trace’] = $e->getTraceAsString(); 换成 $error[‘trace’] = getExceptionTraceAsString($e);
Think.class.php 代码如下:
static public function appException($e) {
$error = array();
$error['message'] = $e->getMessage();
$trace = $e->getTrace();
if('E'==$trace[0]['function']) {
$error['file'] = $trace[0]['file'];
$error['line'] = $trace[0]['line'];
}else{
$error['file'] = $e->getFile();
$error['line'] = $e->getLine();
}
$error['trace'] = getExceptionTraceAsString($e); //修改了此行
Log::record($error['message'],Log::ERR);
// 发送404信息
header('HTTP/1.1 404 Not Found');
header('Status:404 Not Found');
self::halt($error);
}
function.php代码如下:
function getExceptionTraceAsString($exception) {
$rtn = "";
$count = 0;
foreach ($exception->getTrace() as $frame) {
empty($frame['file']) && $frame['file'] = "[internal function]";
empty($frame['class']) || $frame['class'] = $frame['class']."->";
$args = "";
if (isset($frame['args'])) {
$args = array();
foreach ($frame['args'] as $arg) {
if (is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (is_array($arg)) {
$args[] = "Array";
} elseif (is_null($arg)) {
$args[] = 'NULL';
} elseif (is_bool($arg)) {
$args[] = ($arg) ? "true" : "false";
} elseif (is_object($arg)) {
$args[] = get_class($arg);
} elseif (is_resource($arg)) {
$args[] = get_resource_type($arg);
} else {
$args[] = $arg;
}
}
$args = join(", ", $args);
}
$rtn .= sprintf( "#%s %s(%s): %s%s(%s)\n",
$count,
$frame['file'],
$frame['line'],
$frame['class'],
$frame['function'],
$args );
$count++;
}
return $rtn;
}