JavaScript处理window.onerror中的所有错误

JavaScript处理window.onerror中的所有错误,javascript,onerror,Javascript,Onerror,我试图用以下代码处理页面中的所有错误: <!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> <title></title>

我试图用以下代码处理页面中的所有错误:

<!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>
        <title></title>
        <script type="text/javascript">
            window.onerror = function (e, url, line) {
                var data = '{"error":"' + e + '","line":"' + line + '","uri":"' + url + '","client":"' + navigator.appName + '","version":"' + navigator.userAgent + '"}';
                var call = "http://myserver.com/sandbox/error.aspx?e=" + data;

                var jse = document.createElement("script");
                var head = document.getElementsByTagName("head")[0];
                jse.setAttribute("type", "text/javascript");
                jse.setAttribute("src", call);
                head.appendChild(jse);
                alert("fail");
                return true;
            }
        </script>
    </head>
    <body>
        <script type="text/javascript">
            var b;
            a = 5; //a is undefined
            b = 5;
            c = 8; //c is undefined
        </script>
    </body>
</html>
HTTP状态为200OK,数据被传送到服务器。 问题是,如果我改为这样做,则只处理第一个错误:

<!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>
        <title></title>
        <script type="text/javascript">
            window.onerror = function (e, url, line) {
                var data = '{"error":"' + e + '","line":"' + line + '","uri":"' + url + '","client":"' + navigator.appName + '","version":"' + navigator.userAgent + '"}';
                var call = "http://myserver.com/sandbox/error.aspx?e=" + data;

                var jse = document.createElement("script");
                var head = document.getElementsByTagName("head")[0];
                jse.setAttribute("type", "text/javascript");
                jse.setAttribute("src", call);
                head.appendChild(jse);
                alert("fail");
                return true;
            }
        </script>
    </head>
    <body>
        <script type="text/javascript">
            var b;
            a = 5; //a is undefined
            b = 5;
         </script>
         <script type="text/javascript">
            c = 8; //c is undefined
        </script>
    </body>
</html>

window.onerror=函数(e、url、行){
变量数据=“{”错误“:“+e+”,“行“:“+line+”,“uri:“+url+”,“客户端“:“+navigator.appName+”,“版本“:“+navigator.userAgent+”}”;
变量调用=”http://myserver.com/sandbox/error.aspx?e=“+数据;
var jse=document.createElement(“脚本”);
var head=document.getElementsByTagName(“head”)[0];
setAttribute(“type”、“text/javascript”);
setAttribute(“src”,call);
头、尾、尾(jse);
警报(“失败”);
返回true;
}
var b;
a=5//a是未定义的
b=5;
c=8//c是未定义的
然后处理第一个脚本标记的第一个错误和第二个脚本标记的第一个错误,我想处理所有错误,而不仅仅是每个脚本标记的第一个错误


这是可能的吗?

JavaScript在抛出错误后不会继续执行,可能会帮助您解决问题

JavaScript在抛出错误后不会继续执行,可能会帮助您解决问题

您所做的事情有两个方面

首先要回答您的问题,您想要处理的任何大错误本质上都会停止其余代码的运行。因此,如果您希望在处理错误后继续使用代码,则需要在错误处理中定义某种类型的回调函数

所以你可以这样做:

<script type="text/javascript">
        window.onerror = function (e, url, line) {
            var data = '{"error":"' + e + '","line":"' + line + '","uri":"' + url + '","client":"' + navigator.appName + '","version":"' + navigator.userAgent + '"}';
            var call = "http://myserver.com/sandbox/error.aspx?e=" + data;

            var jse = document.createElement("script");
            var head = document.getElementsByTagName("head")[0];
            jse.setAttribute("type", "text/javascript");
            jse.setAttribute("src", call);
            head.appendChild(jse);
            alert("fail");
            return do_work(false);
        }
</script>

<script type="text/javascript">
function do_work(bool){  
    if(bool == true){
        var b;
        a = 5; //a is undefined
        b = 5;
        c = 8; //c is undefined
   }else{
       //skip to new function since there was an error here!
   }
}
</script>
实际上,javascript中没有错误。如果在声明将变量添加到全局范围之前未能使用
var
,则可以在另一个脚本中执行以下操作:

alert(window.a);  // would alert 5

IE提醒你
a
未定义的
这一事实是IE的夸克。

你所做的事情有两个问题

首先要回答您的问题,您想要处理的任何大错误本质上都会停止其余代码的运行。因此,如果您希望在处理错误后继续使用代码,则需要在错误处理中定义某种类型的回调函数

所以你可以这样做:

<script type="text/javascript">
        window.onerror = function (e, url, line) {
            var data = '{"error":"' + e + '","line":"' + line + '","uri":"' + url + '","client":"' + navigator.appName + '","version":"' + navigator.userAgent + '"}';
            var call = "http://myserver.com/sandbox/error.aspx?e=" + data;

            var jse = document.createElement("script");
            var head = document.getElementsByTagName("head")[0];
            jse.setAttribute("type", "text/javascript");
            jse.setAttribute("src", call);
            head.appendChild(jse);
            alert("fail");
            return do_work(false);
        }
</script>

<script type="text/javascript">
function do_work(bool){  
    if(bool == true){
        var b;
        a = 5; //a is undefined
        b = 5;
        c = 8; //c is undefined
   }else{
       //skip to new function since there was an error here!
   }
}
</script>
实际上,javascript中没有错误。如果在声明将变量添加到全局范围之前未能使用
var
,则可以在另一个脚本中执行以下操作:

alert(window.a);  // would alert 5

IE提醒您
a
未定义的
这一事实是IE的夸克。

您的示例中是否遗漏了一些内容?设置
a=5
c=8没有
var
都是正确的
a
c
将被声明为globals,它们无论如何都在该范围内。但是,在声明它们之前尝试检索它们的值会导致异常。不,整个代码都在那里。您是否在示例中遗漏了一些内容?设置
a=5
c=8没有
var
都是正确的
a
c
将被声明为globals,它们无论如何都在该范围内。但是,在声明它们之前尝试检索它们的值会导致异常。不,整个代码都在那里。感谢您的回答,但是函数do_work(bool)实际上不是一个选项,我希望能够在我的页面顶部包含错误脚本,并记录每条消息。然后答案是错误会杀死javascript,因此除非用户触发新的javascript操作,否则您将不会有任何错误需要处理。感谢您的回答,但dou work(bool)函数确实不是一个选项,我希望能够在我的页面顶部包含错误脚本并记录每条消息。然后答案是错误会杀死javascript,因此除非用户触发新的javascript操作,否则您将不会再处理任何错误。