Как зарегистрировать исключения в JavaScript

Поскольку существует неопределенность в вызове метода finalize () JVM (не уверен, будет ли завершен finalize (), который переопределен, или нет), для целей обучения лучший способ наблюдать, что происходит, когда вызывается finalize () , вынуждает JVM вызывать сбор мусора командой System.gc().

В частности, finalize () вызывается, когда объект больше не используется. Но когда мы пытаемся назвать это, создавая новые объекты, нет уверенности в его вызове. Поэтому для уверенности мы создаем объект null c, который, очевидно, не имеет будущего использования, поэтому мы видим окончательный вызов объекта c.

Пример

class Car {

    int maxspeed;

    Car() {
        maxspeed = 70;
    }

    protected void finalize() {

    // Originally finalize method does nothing, but here we override finalize() saying it to print some stmt
    // Calling of finalize is uncertain. Difficult to observe so we force JVM to call it by System.gc(); GarbageCollection

        System.out.println("Called finalize method in class Car...");
    }
}

class Bike {

    int maxspeed;

    Bike() {
        maxspeed = 50;
    }

    protected void finalize() {
        System.out.println("Called finalize method in class Bike...");
    }
}

class Example {

    public static void main(String args[]) {
        Car c = new Car();
        c = null;    // if c weren`t null JVM wouldn't be certain it's cleared or not, null means has no future use or no longer in use hence clears it
        Bike b = new Bike();
        System.gc();    // should clear c, but not b
        for (b.maxspeed = 1; b.maxspeed <= 70; b.maxspeed++) {
            System.out.print("\t" + b.maxspeed);
            if (b.maxspeed > 50) {
                System.out.println("Over Speed. Pls slow down.");
            }
        }
    }
}

Выход

    Called finalize method in class Car...
            1       2       3       4       5       6       7       8       9
    10      11      12      13      14      15      16      17      18      19
    20      21      22      23      24      25      26      27      28      29
    30      31      32      33      34      35      36      37      38      39
    40      41      42      43      44      45      46      47      48      49
    50      51Over Speed. Pls slow down.
            52Over Speed. Pls slow down.
            53Over Speed. Pls slow down.
            54Over Speed. Pls slow down.
            55Over Speed. Pls slow down.
            56Over Speed. Pls slow down.
            57Over Speed. Pls slow down.
            58Over Speed. Pls slow down. 
            59Over Speed. Pls slow down.
            60Over Speed. Pls slow down.
            61Over Speed. Pls slow down.
            62Over Speed. Pls slow down.
            63Over Speed. Pls slow down.
            64Over Speed. Pls slow down.
            65Over Speed. Pls slow down.
            66Over Speed. Pls slow down.
            67Over Speed. Pls slow down.
            68Over Speed. Pls slow down.
            69Over Speed. Pls slow down.
            70Over Speed. Pls slow down.

Примечание. Даже после печати до 70 и после того, какой объект b не используется в программе, существует неопределенность в том, что b очищается или нет JVM, поскольку «Вызывается метод завершения в классе Bike ... "не печатается.

26
задан 4 revs 18 September 2009 в 15:56
поделиться

5 ответов

Вы можете использовать почти таким же образом, например,

try
{
    throw new Error("hahahaha!");
}
catch (e)
{
    alert(e.message)
}

Но если вы хотите получить номер строки и имя файла, где выдается ошибка, я полагаю, что нет кроссбраузерного решения. Сообщение и имя - единственные стандартные свойства объекта Error. В mozilla также есть свойства lineNumber и fileName.

8
ответ дан 28 November 2019 в 06:37
поделиться

Вы не указываете, работаете ли вы в браузере или на сервере. Если это первое, есть новый метод console.error и свойство e.stack :

try {
    // do some crazy stuff
} catch (e) {
    console.error(e, e.stack);
}

Имейте в виду, что ошибка будет работать в Firefox и хром, но это не стандарт. Быстрый пример, который понизится до console.log и будет записывать e, если нет e.stack:

try {
    // do some crazy stuff
} catch (e) {
    (console.error || console.log).call(console, e.stack || e);
}
32
ответ дан 2 revs 28 November 2019 в 06:37
поделиться

Я не уверен, кроссбраузерность это или то, что вы ищете, но я предлагаю вам попробовать:

window.onerror = function (err, file, line) {
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line);
    return true;
}
2
ответ дан 28 November 2019 в 06:37
поделиться
0
ответ дан 28 November 2019 в 06:37
поделиться

Вы можете использовать такие инструменты ведения журнала, как Yahoo! Библиотека пользовательского интерфейса - Регистратор для регистрации ошибок / информационных сообщений.

0
ответ дан 28 November 2019 в 06:37
поделиться