You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.7 KiB

<?php
/**
* Created by PhpStorm.
* User: Admin
* Date: 2018/8/6
* Time: 19:01
*/
namespace app\lib\exception;
use think\Db;
use think\exception\Handle;
use think\Log;
use think\Request;
class ExceptionHandle extends Handle
{
public function render(\Exception $e)
{
if ($e instanceof HtmlException) {
echo $this->responseToHtmlError($e->getMessage());
die;
} else if ($e instanceof JsonException) {
$url = Request::instance()->url();
$result = [
'status' => $e->status,
'message' => $e->message,
'data' => $e->data,
'request_url' => $url,
];
return json($result);
} else if($e instanceof SysException){
//TODO 使用error_log 在数据库记录错误信息
$data = [
'time'=>time(),
//'ip'=>get_client_ip(),
'ip'=>Request::instance()->ip(),
'url'=>$_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : "for-cli",
'message'=>$e->message,
'num'=>$e->errCode,
"data"=>$e->data,
];
Db::name("log")->add($data);
return json(['status'=>-1,"message"=>"系统错误,请重试!"]);
} else {
return parent::render($e);
}
}
public function responseToHtmlError($message,$url = "")
{
$html =
<<<START
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
<title>跳转提示</title>
<style type="text/css">
*{ padding: 0; margin: 0; }
body{ background: #fff; font-family: "Microsoft Yahei","Helvetica Neue",Helvetica,Arial,sans-serif; color: #333; font-size: 16px; }
.system-message{ padding: 24px 48px; }
.system-message h1{ font-size: 100px; font-weight: normal; line-height: 120px; margin-bottom: 12px; }
.system-message .jump{ padding-top: 10px; }
.system-message .jump a{ color: #333; }
.system-message .success,.system-message .error{ line-height: 1.8em; font-size: 36px; }
.system-message .detail{ font-size: 12px; line-height: 20px; margin-top: 12px; display: none; }
</style>
</head>
<body>
<div class="system-message">
<h1>:(</h1>
<p class="error">{$message}</p>
<p class="detail"></p>
<p class="jump">
页面自动 <a id="href" href="javascript:history.back(-1);">跳转</a> 等待时间: <b id="wait">3</b>
</p>
</div>
<script type="text/javascript">
(function(){
var wait = document.getElementById('wait'),
href = document.getElementById('href').href;
var interval = setInterval(function(){
var time = --wait.innerHTML;
if(time <= 0) {
location.href = href;
clearInterval(interval);
};
}, 1000);
})();
</script>
</body>
</html>
START;
return $html;
}
}