最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - log errors with stack trace in javascript - Stack Overflow

programmeradmin4浏览0评论

I'm trying to log javascript errors on a productive site. So far it worked quite well with the following code included in the site:

function catcherr(errorMessage, url, line) {
    var parameters = "msg=" + escape(errorMessage)
            + "&url=" + escape(url)
            + "&line=" + escape(line);

    new Image().src = "/error.gif?" + parameters;

    return false;
};

window.onerror = catcherr;

I'm trying to add a stack trace to the errors to get more information. This basically works with the following idea including into the function above:

    try { i.dont.exist += 0; } // does not exist - that's the point
    catch (e)
    {
            if (e.stack) // Firefox
            {
               // do some stuff

I use jquery, a simple example:

<script type="text/javascript">
jQuery(document).ready(function() {
    p.foo += 1; // this should throw an error
    // do stuff
});
</script>

The funny part is, that when I have an error inside the "ready" function of jquery, the part "try { i.dont.exist += 0; }" does not throw any exception anymore and the engine stops without any error. With the example above, and catcherr extended as follows, only "1" gets alerted:

function catcherr(errorMessage, url, line) {
    try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);}
    alert(2);
    var parameters = "msg=" + escape(errorMessage)
    // ...
}

Anyone having an idea why this breaks, when an error occurs inside the "ready" function of jquery?

I'm trying to log javascript errors on a productive site. So far it worked quite well with the following code included in the site:

function catcherr(errorMessage, url, line) {
    var parameters = "msg=" + escape(errorMessage)
            + "&url=" + escape(url)
            + "&line=" + escape(line);

    new Image().src = "/error.gif?" + parameters;

    return false;
};

window.onerror = catcherr;

I'm trying to add a stack trace to the errors to get more information. This basically works with the following idea including into the function above:

    try { i.dont.exist += 0; } // does not exist - that's the point
    catch (e)
    {
            if (e.stack) // Firefox
            {
               // do some stuff

I use jquery, a simple example:

<script type="text/javascript">
jQuery(document).ready(function() {
    p.foo += 1; // this should throw an error
    // do stuff
});
</script>

The funny part is, that when I have an error inside the "ready" function of jquery, the part "try { i.dont.exist += 0; }" does not throw any exception anymore and the engine stops without any error. With the example above, and catcherr extended as follows, only "1" gets alerted:

function catcherr(errorMessage, url, line) {
    try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);}
    alert(2);
    var parameters = "msg=" + escape(errorMessage)
    // ...
}

Anyone having an idea why this breaks, when an error occurs inside the "ready" function of jquery?

Share Improve this question asked Dec 25, 2009 at 14:25 2ni2ni 5071 gold badge5 silver badges13 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 8

I don't know why you have that problem (it looks very weird and I don't think its a problem with JQuery eating your exceptions, as your alert(1) wouldn't have fired), but I did want to mention your use of Error.stack - when the onerror event gets called, you do not have the stack context of the original error, so getting a stack trace at that point (by catching your own error) will not yield a meaningful stack.

But back to a real answer - instead of simulating a problem by writing specifically broken code so you can catch the error, how about just directly throwing an error? The first line in your onerror handler could be:

try { throw new Error("dummy"); } catch (e) { alert(e.stack); }

This is valid code which will more likely not cause you problems.

Most likely jQuery is wrapping the callback in its own try/catch and ignoring the error.

Try a different exception inside the try/catch. like a=1/0 or baddarr[5]='bad' and see if those trigger exceptions. Sometimes "Object Not Found" errors may be as a result of objects not being loaded yet, and there might be different handling for those than other exceptions.

发布评论

评论列表(0)

  1. 暂无评论