<?php
namespace imcat;
//cp错误异常类
class glbError extends \Exception {
private $erCode = 0;
private $erMsg = '';
private $erFile = '';
private $erLine = 0;
private $erLevel = 0;
private $trace = array();
//抛出错误信息,用于外部调用
static function show($msg="", $code=0, $erFile='', $erLine=0) {
new self($code, $msg, $erFile, $erLine);
}
function __construct($erCode=0, $erMsg='', $erFile='', $erLine=0) {
parent::__construct(); //$erMsg,$erCode
$this->detail($erCode, $erMsg, $erFile, $erLine);
$this->dtrace();
$this->errView();
}
//detail
protected function detail($erCode=0, $erMsg='', $erFile='', $erLine=0) {
if(is_array($erMsg)){
$erStr = implode("<br>", $erMsg);
$this->erMsg = basDebug::hidInfo($erStr, 1);
$this->erCode = $erCode;
}elseif(is_object($erCode)){
$this->erMsg = $erCode->getMessage();
$this->erFile = $erCode->getFile();
$this->erLine = $erCode->getLine();
//$this->trace = $erCode;
$this->erCode = -24;
}elseif(!empty($erFile)){
$this->erMsg = $erMsg;
$this->erCode = $erCode;
$this->erFile = $erFile;
$this->erLine = $erLine;
}elseif(!empty($erMsg)){
$this->erMsg = $erMsg;
$this->erCode = $erCode;
}else{
$err = error_get_last();
if(!empty($err)){
$this->erMsg = $err['message'];
$this->erFile = $err['file'];
$this->erLine = $err['line'];
$this->erCode = $err['type'];
}
}
}
//获取trace信息
protected function dtrace() {
$trace = empty($this->trace) ? $this->getTrace() : $this->trace;
$tInfo = [];
foreach($trace as $t) {
$class = isset($t['class']) ? $t['class'] : '';
$type = isset($t['type']) ? $t['type'] : '';
$function = isset($t['function']) ? $t['function'] : '';
$tInfo[] = @$t['file'] . ' (' . @$t['line'] . ') ' . $class . $type . $function;
}
$this->trace = $tInfo;
}
// 输出错误信息
protected function errView(){
global $_cbase;
// sLevel,message,title,traceInfo:为兼容旧模板
$erCode = $sLevel = empty($this->erCode) ? '[RUN]' : (is_numeric($this->erCode) ? $this->getLevel() : $this->erCode);
$erMsg = $message = $title = basDebug::hidInfo($this->erMsg);
$erFile = $this->erFile;
$erLine = $this->erLine;
$erTrace = basDebug::hidInfo($this->trace);
$traceInfo = implode("<br>",basDebug::hidInfo($this->trace)); // 兼容
//
if(basEnv::isMpro() || basEnv::isAjax() || defined('RUN_AJAX')){
$data = ['errno'=>$erCode, 'errmsg'=>$erMsg, 'erFile'=>$erFile, 'erLine'=>$erLine, 'erTrace'=>$erTrace];
vopApi::view($data);
}else{
glbHtml::httpStatus('404');
include vopTpls::cinc("base:stpl/err_info");
}
if(!defined('ERR_NODIE')){
die(); // ???
}
/*
ob_start();
include vopTpls::cinc("base:stpl/err_ajax");
$re = ob_get_contents();
$re = strip_tags($re,'<li>');
$re = str_replace(array('<li>','</li>'),array(" - ",""),$re);
ob_clean();
*/
}
//错误等级
protected function getLevel() {
$arr = array(
1=> '(E_ERROR)',
2 => '(E_WARNING)',
4 => '(E_PARSE)',
8 => '(E_NOTICE)',
16 => 'E_CORE_ERROR',
32 => 'E_CORE_WARNING',
64 => '(E_COMPILE_ERROR)',
128 => '(E_COMPILE_WARNING)',
256 => '(E_USER_ERROR)',
512 => '(E_USER_WARNING)',
1024 => '(E_USER_NOTICE)',
2047 => 'E_ALL',
2048 => 'E_STRICT',
'-24' => 'EXCEPT_HANDLER',
);
$fix = isset($arr[$this->erCode]) ? "({$arr[$this->erCode]})" : '';
return $this->erCode.$fix;
}
}