Бросив с предыдущего кадра информацию - PullRequest
0 голосов
/ 18 ноября 2018
function api(cmd) {
    if (cmd > 5) throw 'unknown command'
    console.log('executing the command', cmd)
}

api(2)
api(7)

Если вышеуказанный код будет выполнен, будет напечатано это приятное сообщение об ошибке:

executing the command 2

test.js:2
        if (cmd > 5) throw 'unknown command'
                     ^
unknown command

Как я могу (могу ли я?) Получить сообщение об ошибке, вернуться назад на один кадр и отобразить его вместо:

executing the command 2

test.js:7
        api(7)
        ^
unknown command

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я бы посоветовал просто обернуть операторы try/catch следующим образом, он все равно не будет указывать на точную строку, но в зависимости от вашего использования это может быть близкое совпадение, а ваша функция останется неизменной:

function api(cmd) {
        if (cmd > 5 ) throw `Unknown command: ${cmd}`;
        console.log('coommand', cmd);
    }

    try {
        api(3);
        api(10);
    } catch(e) {
        throw e;
    }
0 голосов
/ 18 ноября 2018

Во многих средах JavaScript вы можете получить полный стек вызовов функций «предков» (с их номерами строк) при возникновении ошибки, при условии, что вы поднимаете ошибку с правильным Error объектом.

Поэтому измените код следующим образом:

 if (cmd > 5) throw new Error('unknown command');

Другая возможность - изменить способ использования функции. Например, он может вернуть функцию, которая должна быть вызвана до того, как что-то произойдет:

function api(cmd) {
    if (cmd > 5) return; // Return undefined
    // If all OK, return a function that does the job
    return function() {
       console.log('executing the command', cmd);
       // ....
    }
}

// The "contract" changed, so the caller must add parentheses:

api(2)()
api(7)() // TypeError: api() is not a function
...