JS处理前台页面的所有异常

/ javascript / 没有评论 / 2026浏览

/// <reference path="../../Scripts/jquery-1.4.1-vsdoc.js" />
/// <reference path="yzg.prototype.js" />
/*
作者 : 颜佐光
时间 : 2012-4-5
Email : yanzuoguang@yahoo.com.cn
备注 : 本JS为颜佐光所编写,可以用于任何场景,也可以更改代码,但是不能更改或者去掉作者的名字和备注,否则将追究法律责任。
*/

(function ($) {
    /***************************  start 核心框架处理函数  ***************************************/
    function Throw(name, message, info) {
        if (typeof message == "undefined") { message = name; name = ""; }
        name = name || "异常信息";
        message = message || "发生未知错误,请联系开发人员";
        var err = new Error();
        err.name = name;
        err.message = message;
        err.info = info;
        throw err;
    }


    function NameSpace(base, path, obj) {
        if (typeof base == "string" || typeof base == "number") {
            obj = path; path = base, base = undefined;
        }
        if (typeof base == "undefined") {
            base = window;
        }
        //将路径拆分为命名空间数组
        var paths = (typeof path == "string") ? path.split(".") : [path];
        //设置默认的命名空间为window
        var nameSpace = base;
        //设置已经处理过的命名空间路径
        var handlePaths = [];
        //循环处理路径中的每个节点
        while (paths.length > 0) {
            //提取该命名空间的单个节点名称
            var name = paths.shift();
            //验证是否已经存在对象,存在则拿历史对象处理(当路径结束时对源对象进行扩展)
            //不存在则新建立对象(当路径结束时等于传入的对象)
            if (typeof nameSpace[name] != "undefined") {
                nameSpace = nameSpace[name];
                if (obj && paths.length == 0 && typeof nameSpace == "object") {
                    $.extend(nameSpace, obj);
                }
            }
            else {
                if (obj && paths.length == 0) {
                    nameSpace = nameSpace[name] = obj;
                }
                else {
                    nameSpace = nameSpace[name] = {};
                }
            }
            //将路径写入已经处理的路径
            handlePaths.push(name);
            //将数据类型不正确时抛出异常
            if (typeof nameSpace != "object") {
                Throw("路径错误", 
			"发现路径[@path]已经存在数据,并且该数据的数据类型不为Object,不能进行命名空间扩展!".
		replace("@path", handlePaths.join(".")));
            }
        }
        return nameSpace;
    }
    /***************************  end 核心框架处理函数  ***************************************/


    /***************************  start 异常处理框架  ***************************************/
    function ErrorQueue() {
        this.errorQueue = [];
        this.errorHandle = [];
        this.Throw = function (name, message, info) {
            try {
                Throw(name, message, info);
            } catch (e) {
                var len = this.errorQueue.length;
                this.errorQueue.push(e);
                Throw("" + len);
            }
        };
        this.Get = function (obj) {
            var queueName = obj && (obj.message || obj);
            var index = parseInt(queueName);
            return this.errorQueue[index];
        };
        this.AddHandle = function (func) {
            if (typeof func == "function") {
                this.errorHandle.push(func);
            }
        };
        this.DefaultHandle = function (name, msg, info, url, line) {
            alert("Url : " + url + "\nLine : " + line + "\nName:\n" + name + "\nMsg:\n" + msg);
        };
        this.Handle = function (msg, url, line) {
            var e = this.Get(msg);
            var name = "异常信息";
            var info = null;
            if (e) {
                msg = e.message;
                name = e.name;
                info = e.info;
            }
            try {
                if (this.errorHandle.length == 0) {
                    throw new Error();
                }
                for (var i = 0; i < this.errorHandle.length; i++) {
                    var func = this.errorHandle[i];
                    if (typeof func == "function") {
                        func(name, msg, info, url, line);
                    }
                }
            } catch (ex) {
                this.DefaultHandle(name, msg, info, url, line);
            }
        };
    }


    var error = new ErrorQueue();
    window.onerror = function (msg, url, line) {
        error.Handle.call(error, msg, url, line);
    };


    /***************************  end 异常处理框架  ***************************************/
    var core = {
        Throw: Throw,
        NameSpace: NameSpace
    };


    NameSpace("yzg.core", core);
    NameSpace("yzg.error", error);
})(jQuery);

调用示例:

var error = yzg.error;
error.AddHandle(function (name, msg, info, url, line) {
	$(document.body).append("<div>" + name + msg + info.id + "</div>");
});
error.Throw("高级异常", "异常信息", { id: "5" });