Как повторно вызвать исключение в JavaScript, но сохранить стек?
Трассировка стека передает некоторую часть данных при возникновении исключения. Трассировка стека - это совокупность всех методов, используемых в программе. Он начинается с метода, который вызывает исключение, и заканчивается методом, перехватывающим исключение. В случае повторной генерации исключения трассировка стека перезапускается в текущем методе. Таким образом, список вызовов методов между методом, который вызывает исключение, и текущим методом теряется. Один из способов избежать этого - перехватить ошибку и сохранить ее локально, а затем повторно выбросить ошибку. Однако в JavaScript нет функции rethrow (). Таким образом, мы бросаем исходную ошибку. Чтобы понять приведенный выше контекст, обратитесь к следующему примеру.
Пример 1: В классном тесте Радха должна ответить на вопросы учителя. Учитель дает Радхе число и спрашивает ее, является ли данное число действительным числом дня, и если да, то укажите соответствующий день. Если данный номер дня недействителен, Радха должна ответить «Недействительный номер дня». Если мы запустим код, встроенная страница покажет трассировку стека. Он покажет, что ошибка возникла в day (), а затем была повторно выбрана в month () и, наконец, была обнаружена в year (). Поскольку 8 выходит за пределы, вывод отображается как Недействительный день.
Ввод: 8 Вывод: ошибка возникла в day () и была выдана. Неверный день Ошибка была обнаружена и повторно сгенерирована через месяц () Неверный день Ошибка была наконец обнаружена в году () Неверный день
- Программа:
<!DOCTYPE html>
<html>
<head>
<script>
year();
// For the year //
function
year() {
try
{
month();
}
catch
(e) {
console.log(
'Error was finally caught in year():'
, e.message);
alert(e.stack);
}
}
// Fo the month //
function
month() {
try
{
day();
}
catch
(e) {
console.log(
'Error was then caught and rethrown in month():'
, e.message);
throw
(e);
}
}
function
day() {
var
d = 8;
var
days = [
'Mon'
,
'Tue'
,
'Wed'
,
'Thurs'
,
'Fri'
,
'Sat'
,
'Sun'
];
try
{
d = d - 1;
if
(days[d] != undefined)
console.log(
"valid day:"
, days[d]);
else
// Message is "Invalid day"
throw
new
Error(
"Invalid day"
);
}
catch
(e) {
console.log(
"Error originated in day() and was thrown:"
, e.message)
throw
(e);
}
}
</script>
</head>
<body>
<h1>Welcome To Geeksforgeeks</h1>
</body>
</html>
- Выход:
Ошибка возникла в day () и была выдана: Неверный день Затем ошибка была обнаружена и повторно выдана в month (): Неверный день Наконец, ошибка была обнаружена в year (): Неверный день
Пример 2: Число 5 - действительный номер дня, поэтому ошибка не выдается. Следовательно, мы получаем результат как действительный день.
Ввод: 5 Выход: действительный день: Пт
<!DOCTYPE html> <html> <head> <script> year(); function year() { try { month(); } catch (e) { console.log( 'Error was finally caught in year()' , e.message); alert(e.stack); } } function month() { try { day(); } catch (e) { console.log( 'Error was caught and rethrown in month()' , e.message); throw (e); } } function day() { var d = 5; var days = [ 'Mon' , 'Tue' , 'Wed' , 'Thurs' , 'Fri' , 'Sat' , 'Sun' ]; try { d = d - 1; if (days[d] != undefined) console.log( "valid day:" , days[d]); else throw new Error( "Invalid day" ); } catch (e) { console.log( "Error originated in day() and was thrown:" , e.message); throw (e); } } </script> </head> <body> <h1>Welcome To Geeksforgeeks</h1> </body> </html> |
действительный день: Пт