使用Raygun来自动追踪AngularJS中的异常


Posted in Javascript onJune 23, 2015

Angular.js取得的巨大成就之一是实用的异常抛出,因为异常信息经常能够准确的表明你的代码为什么崩溃了。运行于世界各地的众多浏览器的大型客户端web应用会面临异常丢失的问题,而捕获它就有可能修复 bug并赢得用户。

当处理跨浏览器和设备的问题时,接收这些异常信息是很重要的,因为你的应用可能在你的开发机器上运行得正确可靠,但在你的用户的浏览器上却是另一番场景。

其解决方案是需要一个自动异常跟踪服务,而Raygun通过接收你的Angular web应用抛出的所有异常但不需要你做任何事,从而简化了这项工作。它的设置真的很快--只需要按照以下步骤将Raygun hook到你的应用就可以了。

安装

首先,下载小巧的Raygun4JS脚本,并把它添加到你的项目中。有3个途径获得:

通过Bower
 

bower install raygun4js

从NuGet获得——在Visual Studio中,打开包管理器控制台然后输入:
 

Install-Package raygun4js

手动下载 ? 点击此处下载dev版 或者压缩过的版本
配置

接下来,引用这个脚本。如果你使用静态的HTML,将<script src="js/raygun.js" type="text/javascript"></script>添加到页面里面或添加到你的模块加载器中。

最后,在你的Angular主逻辑执行之前调用下面的代码来设置Raygun4JS:
 

Raygun.init('YOUR_API_KEY').attach();

你可以为每一个用Raygun创建的app生成一个API key,你可以在你的Raygun dashboard 中访问他——你有30天免费试用时间来测试它。
在Angular中捕获异常

至少有两种方法将未处理的异常注射到Angular.js的模块中,通过使用decorator 或 factory。这两种方式会为你提供$exceptionHandler的具体实现,我们上面所提到的Raygun4JS会将该实现发送给Raygun。

使用一个装饰器

装饰器模式因其不会覆盖掉原有的行为,所以很适合用来将行为注入到任意的服务中,以确保在其它所期望的特性中分离关注点,它也是记录日志和处理异常的理想方式. 在Angular.js中它可以使用在 $provide 服务中,我们将用来实现我们自己的

$exceptionHandler 函数:
 
app.config(function ($provide) {
 $provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
  return function (exception, cause) {
   Raygun.send(exception);
   $delegate(exception, cause);
  }
 }])
});

$delegate 是异常处理器的实体,我们会调用它来获得输出到控制台的原始行为.

你也可以按照自己的需要创建足够多的其它服务:
 

$provide.decorator("$exceptionHandler", ['$delegate', '$log', function($delegate, $log) {
  return function (exception, cause) {
   $log.debug('Sending to Raygun');
   Raygun.send(exception);
   $delegate(exception, cause);
  }
 }])

依赖于所获取到的自Angular逻辑中抛出的错误是什么类型, cause 参数得以被填充. 如果一个异常发生在一个工厂或者服务中,你可能会得到那个参数可以的范围, 你可以将其作为自定义数据,通过替换掉上面的Raygun.send调用,附带任何你需要的其它东西,再传送到Raygun:
 

Raygun.send(exception, { cause: cause });

使用一个工厂

快速的将Raygun放到你的应用的异常处理器中的方法就是使用一个工厂, 尽管它会移除原来的控制台日志,而如果你想要保留此项功能的话,就会需要存储原来的值并再一次调用它.
 

app.factory('$exceptionHandler', function () {
 return function (exception) {
  Raygun.send(exception);
 }
});

手动发送错误

Raygun4JS 也归于了你任意时间很容易的手动跟踪错误的能力:
 

Raygun.send(new Error('my custom error'));

供应器上还有一堆其它使用的工具可以利用,包括独特的用户跟踪,版本跟踪,标签及其它 ? 这里的文档可以查看 的所有相信信息.

Raygun 甚至可以在你的Angular应用中跟踪jQuery 的Ajax错误even tracks jQuery Ajax errors ,而无需你的做任何额外的事情, 因此你将得到开箱即用的全面照顾.
准备好使用Raygun了吗?

如之前所提及的,有一个 30天免费的无信用卡支付的版本可用, 因此你可以获取一个来看看你的应用是否真的是在为你的用户运作的. 如果就本文你有任何的疑问,请将它们留在下面的评论中。

Javascript 相关文章推荐
一个加密JavaScript的开源工具PACKER2.0.2
Nov 04 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
Apr 24 Javascript
Bootstrap网格系统详解
Apr 26 Javascript
js添加千分位的实现代码(超简单)
Aug 01 Javascript
bootstrap常用组件之头部导航实现代码
Apr 20 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 jQuery
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
node.js中axios使用心得总结
Nov 29 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
JavaScript模板引擎应用场景及实现原理详解
Dec 14 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
Nov 03 Javascript
使用JavaScript的AngularJS库编写hello world的方法
Jun 23 #Javascript
浅谈setTimeout 与 setInterval
Jun 23 #Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
Jun 23 #Javascript
javascript中传统事件与现代事件
Jun 23 #Javascript
浅谈jquery中delegate()与live()
Jun 22 #Javascript
jquery 中ajax执行的优先级
Jun 22 #Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 #Javascript
You might like
PHP swfupload图片上传的实例代码
2013/09/30 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP二维数组去重算法
2016/12/17 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
微信小程序实现天气预报功能
2018/07/18 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
容易被忽略的Python内置类型
2020/09/03 Python
保险专业自荐信范文
2014/02/20 职场文书
村干部承诺书
2014/03/28 职场文书
《恐龙》教学反思
2014/04/27 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
中学生打架检讨书
2014/10/13 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
小马王观后感
2015/06/11 职场文书
修辞手法有哪些?
2019/08/29 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS