Browse Source

Fixed stack trace bug and added class/method call information.

tags/2.0.0-beta
resurtm 11 years ago
parent
commit
b525d9c720
  1. 39
      framework/yii/base/ErrorHandler.php
  2. 40
      framework/yii/views/errorHandler/callStackItem.php
  3. 5
      framework/yii/views/errorHandler/main.php

39
framework/yii/base/ErrorHandler.php

@ -149,6 +149,13 @@ class ErrorHandler extends Component
$html .= '<a href="http://yiiframework.com/doc/api/2.0/' . $this->htmlEncode($part) . '" target="_blank">' . $this->htmlEncode($part) . '</a>\\';
}
$html = rtrim($html, '\\');
} elseif (strpos($code, '()') !== false) {
// method/function call
$self = $this;
$html = preg_replace_callback('/^(.*)\(\)$/', function ($matches) use ($self) {
return '<a href="http://yiiframework.com/doc/api/2.0/' . $this->htmlEncode($matches[1]) . '" target="_blank">' .
$self->htmlEncode($matches[1]) . '</a>()';
}, $code);
}
return $html;
}
@ -184,27 +191,35 @@ class ErrorHandler extends Component
/**
* Renders a single call stack element.
* @param string $file name where call has happened.
* @param integer $line number on which call has happened.
* @param string|null $file name where call has happened.
* @param integer|null $line number on which call has happened.
* @param string|null $class called class name.
* @param string|null $method called function/method name.
* @param integer $index number of the call stack element.
* @return string HTML content of the rendered call stack element.
*/
public function renderCallStackItem($file, $line, $index)
public function renderCallStackItem($file, $line, $class, $method, $index)
{
$line--; // adjust line number from one-based to zero-based
$lines = @file($file);
if ($line < 0 || $lines === false || ($lineCount = count($lines)) < $line + 1) {
return '';
}
$lines = array();
$begin = $end = 0;
if ($file !== null && $line !== null) {
$line--; // adjust line number from one-based to zero-based
$lines = @file($file);
if ($line < 0 || $lines === false || ($lineCount = count($lines)) < $line + 1) {
return '';
}
$half = (int)(($index == 0 ? $this->maxSourceLines : $this->maxTraceSourceLines) / 2);
$begin = $line - $half > 0 ? $line - $half : 0;
$end = $line + $half < $lineCount ? $line + $half : $lineCount - 1;
$half = (int)(($index == 0 ? $this->maxSourceLines : $this->maxTraceSourceLines) / 2);
$begin = $line - $half > 0 ? $line - $half : 0;
$end = $line + $half < $lineCount ? $line + $half : $lineCount - 1;
}
$view = new View();
return $view->renderFile($this->callStackItemView, array(
'file' => $file,
'line' => $line,
'class' => $class,
'method' => $method,
'index' => $index,
'lines' => $lines,
'begin' => $begin,
@ -219,7 +234,7 @@ class ErrorHandler extends Component
*/
public function isCoreFile($file)
{
return $file === 'unknown' || strpos(realpath($file), YII_PATH . DIRECTORY_SEPARATOR) === 0;
return $file === null || strpos(realpath($file), YII_PATH . DIRECTORY_SEPARATOR) === 0;
}
/**

40
framework/yii/views/errorHandler/callStackItem.php

@ -1,8 +1,10 @@
<?php
/**
* @var \yii\base\View $this
* @var string $file
* @var integer $line
* @var string|null $file
* @var integer|null $line
* @var string|null $class
* @var string|null $method
* @var integer $index
* @var string[] $lines
* @var integer $begin
@ -11,23 +13,31 @@
*/
$context = $this->context;
?>
<li class="<?php if (!$context->isCoreFile($file)) echo 'application'; ?> call-stack-item">
<li class="<?php if (!$context->isCoreFile($file) || $index === 1) echo 'application'; ?> call-stack-item">
<div class="element-wrap">
<div class="element">
<span class="number"><?php echo (int)$index; ?>.</span>
<span class="text">in <?php echo $context->htmlEncode($file); ?></span>
<span class="at">at line</span>
<span class="line"><?php echo (int)$line; ?></span>
<span class="text"><?php if ($file !== null) echo 'in ' . $context->htmlEncode($file); ?></span>
<?php if ($method !== null): ?>
<span class="call">
<?php if ($file !== null) echo '&ndash;' ?>
<?php if ($class !== null) echo $context->addTypeLinks($class) . '→'; ?><?php echo $context->addTypeLinks($method . '()'); ?>
</span>
<?php endif; ?>
<span class="at"><?php if ($line !== null) echo 'at line'; ?></span>
<span class="line"><?php if ($line !== null) echo (int)$line; ?></span>
</div>
</div>
<div class="code-wrap">
<div class="error-line" style="top: <?php echo 18 * (int)($line - $begin); ?>px;"></div>
<?php for ($i = $begin; $i <= $end; ++$i): ?>
<div class="hover-line" style="top: <?php echo 18 * (int)($i - $begin); ?>px;"></div>
<?php endfor; ?>
<div class="code">
<span class="lines"><?php for ($i = $begin; $i <= $end; ++$i) echo (int)$i . '<br/>'; ?></span>
<pre><?php for ($i = $begin; $i <= $end; ++$i) echo $context->htmlEncode($lines[$i]); ?></pre>
<?php if (!empty($lines)): ?>
<div class="code-wrap">
<div class="error-line" style="top: <?php echo 18 * (int)($line - $begin); ?>px;"></div>
<?php for ($i = $begin; $i <= $end; ++$i): ?>
<div class="hover-line" style="top: <?php echo 18 * (int)($i - $begin); ?>px;"></div>
<?php endfor; ?>
<div class="code">
<span class="lines"><?php for ($i = $begin; $i <= $end; ++$i) echo (int)$i . '<br/>'; ?></span>
<pre><?php for ($i = $begin; $i <= $end; ++$i) echo $context->htmlEncode($lines[$i]); ?></pre>
</div>
</div>
</div>
<?php endif; ?>
</li>

5
framework/yii/views/errorHandler/main.php

@ -364,9 +364,10 @@ pre .diff .change{
<div class="call-stack">
<ul>
<?php echo $context->renderCallStackItem($exception->getFile(), $exception->getLine(), 1); ?>
<?php echo $context->renderCallStackItem($exception->getFile(), $exception->getLine(), null, null, 1); ?>
<?php for ($i = 1, $trace = $exception->getTrace(), $length = count($trace); $i < $length; ++$i): ?>
<?php echo $context->renderCallStackItem($trace[$i]['file'], $trace[$i]['line'], $i + 1); ?>
<?php echo $context->renderCallStackItem(@$trace[$i]['file'] ?: null, @$trace[$i]['line'] ?: null,
@$trace[$i]['class'] ?: null, @$trace[$i]['function'] ?: null, $i + 1); ?>
<?php endfor; ?>
</ul>
</div>

Loading…
Cancel
Save