技术标签: python catch
什么是JCatch
当程序发生异常(Exception),处理方式一般是通过日志文件记录下来,这种方式很容易被忽略,而且查询起来比较麻烦。
JCatch提供了一种方案,当程序发生异常时,通过JCatch平台接口提交到JCatch平台,由JCatch平台统一管理所有异常,这样可以方便查询,并且JCatch平台提供异常监控功能,当应用程序发生异常时会以邮件方式提醒相关人员。
应用列表:
应用配置:
异常列表:
Java异常详情:
PHP异常:
邮件通知:
运行/部署JCatch
MySQL数据库
使用MySQL数据库执行doc/sql.sql中的SQL脚本创建表
修改src/main/resources/MyBatis.xml文件中的数据库连接
配置登录管理员账户
默认管理员账户: 用户名 admin 密码 xxg
管理员登录基于Spring Security实现,可以配置src/main/resources/springSecurity.xml文件
支持邮件订阅功能
邮件订阅功能会在应用发生异常时,每小时发送一封邮件给应用订阅者,邮件内容为这个小时内的异常信息,配置src/main/resources/messageService.xml支持邮件订阅
打包
mvn package命令生成war包,可部署在Tomcat、Jetty等服务器中
运行MyBatis Generator生成代码
如果二次开发需要修改表结构, 修改src/main/resources/generatorConfig.xml文件中的数据库连接, com.xxg.jcatch.mbg包下代码是通过MyBatis Generator自动生成的,可以运行mvn mybatis-generator:generate命令生成代码
API
提交一条Exception
URL: http://[your baseUrl]/api/submitExceptionJson?appId=[your appId]
请求类型: POST
请求Body:
{
"fileName": "Main.java",
"methodName": "main",
"className": "com.xxg.jcatch.Main",
"stackTrace": "java.lang.ArithmeticException: / by zero\n\tat com.xxg.jcatch.Main.main(Main.java:16)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:498)\n\tat com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)\n",
"message": "/ by zero",
"lineNumber": 16,
"exceptionName": "java.lang.ArithmeticException"
}
响应Body:
{
"success": true
}
客户端接入
Java
PHP
通用
function submitToJCatch($e) {
$json = json_encode($e);
$ch = curl_init('http:///api/submitExceptionJson?appId=');
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
CURLOPT_POSTFIELDS => $json,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
));
curl_exec($ch);
}
function error_handler($errno, $errstr, $errfile, $errline) {
submitToJCatch(array(
'message' => $errstr,
'fileName' => $errfile,
'lineNumber' => $errline,
));
}
function exception_handler($exception) {
submitToJCatch(array(
"fileName" => $exception->getFile(),
"lineNumber" => $exception->getLine(),
"stackTrace" => $exception->getTraceAsString(),
"message" => $exception->getMessage(),
"exceptionName" => get_class($exception)
));
}
set_error_handler("error_handler");
set_exception_handler("exception_handler");
PHP的错误和异常会通过set_error_handler、set_exception_handler指定的函数来处理,一般PHP框架都会有自己的一套错误处理机制,如果使用PHP框架建议通过框架本身的错误处理机制来提交错误到JCatch,下面有各个框架接入JCatch的方法。
Laravel
修改App/Exceptions/Handler.php文件:
public function report(Exception $exception)
{
$appId = '';
$submitUrl = 'http:///api/submitExceptionJson?appId=' . $appId;
$data = json_encode([
"fileName" => $exception->getFile(),
"lineNumber" => $exception->getLine(),
"stackTrace" => $exception->getTraceAsString(),
"message" => $exception->getMessage(),
"exceptionName" => get_class($exception)
]);
$ch = curl_init($submitUrl);
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
CURLOPT_POSTFIELDS => $data,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
));
curl_exec($ch);
return parent::report($exception);
}
CodeIgniter 3.x
在application/core目录下新建文件MY_Exceptions.php,代码如下:
class MY_Exceptions extends CI_Exceptions
{
public function log_exception($severity, $message, $filepath, $line)
{
parent::log_exception($severity, $message, $filepath, $line);
$json = json_encode(array(
"message" => $message,
"fileName" => $filepath,
"lineNumber" => $line
));
$ch = curl_init('http:///api/submitExceptionJson?appId=');
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
CURLOPT_POSTFIELDS => $json,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
));
curl_exec($ch);
}
}
当发生错误或异常时,CI框架会自动调用以上代码,将异常信息提交到JCatch API。
Yii 1.1
在protected/components目录下新建文件ErrorHandler.php,代码如下:
class ErrorHandler extends CErrorHandler
{
public $jcatchBaseUrl;
public $jcatchAppId;
public $jcatchSecretKey;
protected function handleException($exception)
{
parent::handleException($exception);
$this->submitToJCatch(array(
"fileName" => $exception->getFile(),
"lineNumber" => $exception->getLine(),
"stackTrace" => $exception->getTraceAsString(),
"message" => $exception->getMessage(),
"exceptionName" => get_class($exception)
));
}
protected function handleError($event)
{
parent::handleError($event);
$this->submitToJCatch(array(
'message' => $event->message,
'fileName' => $event->file,
'lineNumber' => $event->line,
));
}
private function submitToJCatch($e) {
$json = json_encode($e);
$ch = curl_init($this->jcatchBaseUrl.'/api/submitExceptionJson?appId='.$this->jcatchAppId);
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
CURLOPT_POSTFIELDS => $json,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
));
curl_exec($ch);
}
}
修改所使用的配置文件,例如protected/config/main.php:
'errorHandler'=>array(
'errorAction'=>'site/error',
'class'=>'ErrorHandler',
'jcatchBaseUrl'=>'',
'jcatchAppId'=>'',
'jcatchSecretKey'=>'',
),
当发生错误或异常时,Yii框架会自动调用ErrorHandler来处理异常,将异常信息提交到JCatch API。
文章浏览阅读1.4k次。一,代码及其设置#include <stdio.h>int fputc(int ch, FILE *f)//Stm8005 重定向{ while (!(UART2->SR&0x80)); UART2->DR=ch; return ch;}同时需要修改IAR的Projec t- >Options -> General..._error[li009]: runtime model conflict: module xxexit.o(dbgstm8smn.a) specifie
文章浏览阅读1.8w次,点赞4次,收藏69次。源码和jar见:https://github.com/evil0ps/utils#Java Utils封装了一些常用Java操作方法,便于重复开发利用.另外希望身为Java牛牛的你们一起测试和完善,欢迎入群263641914 一起封装和完成常用的Java代码。节约撸码时间以方便有更多的时间去把妹子~#开发环境Win7x64JDK1.7IDEA14#项目结构│ README.m..._utils.getapp() java
文章浏览阅读3.2k次。离线安装virtualenv和django工作中需要离线安装django,记录下: 环境: 离线机器系统:centos 6.5 python 版本: python 2.6.6 virtualenv 版本: 1.9 django 版本: 1.6.11 离线安装virtualenv 下载安装包 $ curl -O https://pypi.python.o..._linux离线安装django
文章浏览阅读1.3w次,点赞5次,收藏23次。在Debian 10上安装桌面环境如果在安装过程中没有选择桌面,只是安装了标准系统Debian提供了一个命令行工具(tasksel)来简化桌面环境的安装,只需运行如下命令即可:$ sudo tasksel然后,你可以从列表中选择所需的桌面环境,如下图所选的是Cinnamon:从要安装的软件列表中选择Cinnamon,然后使用选择“ok”:稍等片刻,注销或者重启即可..._debian10 安装桌面
文章浏览阅读8.8k次。我们的项目,由于先做的安卓APP的开发,在安卓上测试视频播放通过以后。同样的接口放到IOS上是不能播放的。后来查了相关资料了解到其中的差别,总的来说,安卓上是请求一个视频链接,返回一整个视频文件。但是在IOS上,不是一次性请求全部文件的,一般首先会请求0-1字节,然后多次分段请求视频数据。 所以首先要解析Request Headers里面的Range字段,获取本..._safari用get方法请求视频资源
文章浏览阅读4.1k次,点赞5次,收藏23次。我这里说3种方法 一种数据流 有点速度比较快,缺点列表宽度不适配 日期长的直接显示##### 拉宽了才会显示正常。//1导出 excel 数据流方式 public static void ExcelBtnLiu(DataGridView dgvUseName, string name) { if (dgvUseName.Rows.Co..._winfromexcel导出保存文件
文章浏览阅读3.5w次,点赞78次,收藏181次。1.找到File目录下的Settings打开2.找到Editor并打开3.找到Editor下的File and Code Templates并打开4.先选中Files再点击+号5.Name的值改为XML File ,Extension(文件后缀)里面填xml ,内容中间的内容为选中下方的Enable Live Templates后点击Apply,最后点击OK6.右键项目new --> XML File _idea创建xml配置文件
文章浏览阅读504次。vue v-charts面积图实现_v-charts-v2
文章浏览阅读62次。转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8830286原文地址为:http://developer.android.com/training/multiscreen/screensizes.html本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法:让你的布局能充分的自适应屏幕根据屏..._
文章浏览阅读1.3k次。一、查看进程是否运行: ps -ef | grep httpd二、查看端口号: netstat -nlp|grep xxx (xxx是pid)第一步:ping xxx服务所在的机器的ip: 网络环境能够ping通的,服务正常,不能ping通,需要排查。Windows:Linux:第二步:查看xxx服务的端口号和服务地址(监听地址)第三步 telnet xxxxxx yy (x..._根据进程号和端口号判断服务是否存活
文章浏览阅读4.1k次,点赞7次,收藏49次。问题近期在研究C^3 Framework系列之一:一个基于PyTorch的开源人群计数框架为了实现自行标注数据集,也就是针对诸如MCNN等工程制作自己的mat文件,或者csv文件。最终结果大概是这样数据标定针对上述三张照片,通过matlab代码进行数据标定,标定过程类似于这样对应代码%对图片上某个点进行标注clear allclose allclcset(gcf,'co..._get_density_map_gaussian matlab
文章浏览阅读1.1k次。围棋使用格状棋盘及黑白二色棋子进行对弈,双方在网格交叉点上交替放置黑白两色棋子,落子后不能移动,围地吃子,以所围“地”的大小决定胜负。这是一款小编用C++编写的可以双人对决的围棋程序,程序不很复杂,通过编写这个小程序,让我对VC++有了更深层的了解。项目结构展示:源码展示:声明:本文内容来源于网络,如有侵权请联系删除..._胜负对决c++