Ajax技术基础__Ajax的错误处理机制探讨


======================================================
注:本文源代码点此下载
======================================================

ajax框架组件的核心是xmlhttprequest javascript对象,它允许客户端开发人员在不中断用户操作、不利用隐藏页面的情况下,通过http发送和接收xml文档现在,有些人可能会感到恐惧,因为它突然允许那些可能过多地使用了验证窗体和动画图像的客户端开发人员负责传递xml文档和处理http头信息,但是,没有风险就没有收益我们不用害怕,我将演示如何使用xmlhttprequest来添加一些以前不可能的、行不通的特性,它同时还减少了错误,提高了产品质量

javascript中的xmlhttprequest和xml dom

首先,我们需要建立一些规则特殊的xmlhttprequest对象和一般的xml dom都受到了最新的浏览器(ie、mozilla、safari、opera)的广泛支持,尽管在一般情况下,微软对于自己的实现会稍微增加一些东西,需要某些特殊的处理尽管我们更多的朋友直接实现了xmlhttprequest,但是ie还是要求你用相同的属性实例化一个activexobject在apple开发者关系站点上可以找到相关的概述和所有特性列表下面是一个基本的例子:

var req;

function postxml(xmldoc) {

if (window.xmlhttprequest) req = new xmlhttprequest();

else if (window.activexobject) req = new activexobject("microsoft.xmlhttp");

else return; // 失败了

req.open(method, serveruri);

req.setrequestheader(’content-type’, ’text/xml’);

req.onreadystatechange = xmlposted;

req.send(xmldoc);

}

function xmlposted() {

if (req.readystate != 4) return;

if (req.status == 200) {

var result = req.responsexml;

} else {

// 失败了

}

}

这种强大的功能的潜在用户是很多的,对于它可能实现的功能的探索才刚刚开始但是在你试图在web上的建立xml功能之前,我建议你设置一个"安全网"来保证你的抱负(想法)不会受到打击

javascript错误处理基础

javascript已经出现很久了,它的早期版本比较原始,缺少特性,仅仅是实现了而已最新的浏览器不但支持c++和java中try/catch/finally关键字,而且实现了onerror事件,而这个事件可以捕捉运行时出现的任何错误它的使用是非常直接的:

function riskybusiness() {

try {

riskyoperation1();

riskyoperation2();

} catch (e) {

// e是一个error类型的对象,至少有两个属性:name和message

} finally {

// 清除消息

}

}

window.onerror = handleerror; // 捕捉所有错误的安全网

function handleerror(message, uri, line) {

// 提示用户这个页面可能无法正常响应

return true; // 停止默认的消息

}

实际的例子:把客户端错误传递到服务器

现在我们知道了xmlhttprequest和javascript错误处理的一些基础知识了,我们来看一个同时使用了两者的实现例子你可能认为javascript错误可以很简单地在流行的"黄色死亡三角"中显示出来,但是仍然有一些错误传递到了几家篮筹股公司的公共web站点的质量部门了

因此,我将提供一个用于捕捉错误并把错误记录到服务器上的方法,这样其他人就可能修补这些问题首先,我们考虑客户端客户端必须提供一个类,它被用作日志记录器(logger)对象,可以透明地处理各种细节信息

下面是我们建立的构造函数:

// 类的构造函数

function logger() {

// 字段

this.req;

// 方法

this.errortoxml = errortoxml;

this.log = log;

}

接下来,我们定义了一个方法,它会把error对象序列化为xml在默认情况下,error对象只有两种属性,分别是name和message,但是我们还是使用了第三个属性(location),它有时候是有用的

// 把错误映射到xml文档中

function errortoxml(err) {

var xml = ’\n’ +

’\n’ +

’’ + err.name + ’\n’ +

’’ + err.message + ’\n’;

if (err.location) xml += ’’ + err.location +’’;

xml += ’’;

return xml;

}

接着是log方法这是脚本最基本的部分,它真正地实现了上述的原理请注意,我们在调用中使用的是post方法从本质上说,我在此处建立的是一个定制的web服务,它是只读的,并为每个成功的请求建立新记录因此,post是唯一适当的选择

// 日志记录类的log方法

function log(err) {

// 查看特性

if (window.xmlhttprequest) this.req = new xmlhttprequest();

else if (window.activexobject) this.req =new activexobject("microsoft.xmlhttp");

else return; // 失败了

// 设置方法和uri

this.req.open("post", "/cgi-bin/ajaxlogger.cgi");

// 设置请求头信息referer 是顶层uri,如果它发生在一个包含的.js文件中

// 那么它的位置与错误的位置可能不同

this.req.setrequestheader(’referer’, location.href);

this.req.setrequestheader(’content-type’, ’text/xml’);

// 请求完成的时候调用的函数

this.req.onreadystatechange = errorlogged;

this.req.send(this.errortoxml(err));

// 如果请求在10秒钟内没有完成,就出现一些错误消息

this.timeout = window.settimeout("abortlog();", 10000);

}

类的最后一部分建立了一个logger类实例这个类应该只有一个实例

// 只有一个日志记录器实例

var logger = new logger();

最后的两个函数只是用于琐碎事务管理的如果在记录错误的时候出现了问题,除了干扰用户之外,我们几乎不能做任务事务但是,这种情况永远不会出现这些不是类的方法,因为事件没有指向我们的对象的指针,但是它会指向我们建立的logger实例

// 我们试过了,但是连接错误,没有希望了

function abortlog() {

logger.req.abort();

alert("attempt to log the error timed out.");

}

// 请求的状态发生改变的时候调用

function errorlogged() {

if (logger.req.readystate != 4) return;

window.cleartimeout(logger.timeout);

// 请求完成了

if (logger.req.status >= 400)

alert(’attempt to log the error failed.’);

}


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值