может также использоваться без выражения, тогда она просто прерывает выполнение функции и возвращает значение
undefined
вызывающей программе. Например:
function display_object(o) {
// Сразу же вернуть управление, если аргумент имеет значение null или undefined
if (!о) return;
// Здесь находится оставшаяся часть функции...
}
Из-за того что интерпретатор JavaScript автоматически вставляет точки с запятой, нельзя разделять переводом
строки инструкцию
return
и следующее за ней выражение.
5.6.5. Инструкция throw
Исключение - это сигнал, указывающий на возникновение какой-либо исключительной ситуации или ошибки. Возбуждение исключения (
throw
) - это способ просигнализировать о такой ошибке или исключительной ситуации. Перехватить исключение (
catch
) - значит обработать его, т. е. предпринять действия, необходимые или подходящие для восстановления после исключения. В JavaScript исключения возбуждаются в тех случаях, когда возникает ошибка времени выполнения и когда программа явно возбуждает его с помощью инструкции
throw
. Исключения перехватываются с помощью инструкции
try/catch/finally
, которая описана в следующем разделе.
Инструкция
throw
имеет следующий синтаксис:
throw выражение;
Результатом выражения может быть значение любого типа. Инструкции throw можно передать число, представляющее код ошибки, или строку, содержащую текст сообщения об ошибке. Интерпретатор JavaScript возбуждает исключения, используя экземпляр класса
Error
одного из его подклассов, и вы также можете использовать подобный подход. Объект
Error
имеет свойство
name
, определяющее тип ошибки, и свойство
message
, содержащее строку, переданную функции-конструктору (смотрите описание класса
Error
в справочном разделе). Ниже приводится пример функции, которая возбуждает объект
Error
при вызове с недопустимым аргументом:
function factorial(x) {
// Если входной аргумент не является допустимым значением, возбуждается исключение!
if (х < 0) throw new Error("x не может быть отрицательным");
// В противном случае значение вычисляется и возвращается нормальным образом
for(var f = 1; х>1; f*=x, х--) /* пустое тело цикла */ ;
return f;
}
Когда возбуждается исключение, интерпретатор JavaScript немедленно прерывает нормальное выполнение программы и переходит к ближайшему [7] обработчику исключений. В обработчиках исключений используется конструкция
catch
инструкции
try/catch/finally
, описание которой приведено в следующем разделе. Если блок программного кода, в котором возникло исключение, не имеет соответствующей конструкции
catch
, интерпретатор анализирует следующий внешний блок программного кода и проверяет, связан ли с ним обработчик исключений. Это продолжается до тех пор, пока обработчик не будет найден. Если исключение генерируется в функции, не содержащей инструкции
try/catch/finally
, предназначенной для его обработки, то исключение распространяется выше, в программный код, вызвавший функцию. Таким образом исключения распространяются по лексической структуре методов JavaScript вверх по стеку вызовов. Если обработчик исключения так и не будет найден, исключение рассматривается как ошибка и о ней сообщается пользователю.
7
К
самому внутреннему по вложенности охватывающему обработчику исключений. – Прим. науч. ред.
5.6.6. Инструкция try/catch/finally
Инструкция
try/catch/finally
реализует механизм обработки исключений в JavaScript. Конструкция
try
в этой инструкции просто определяет блок кода, в котором обрабатываются исключения. За блоком
try
следует конструкция
catch
с блоком инструкций, вызываемых, если где-либо в блоке
try
возникает исключение. За конструкцией
catch
следует блок
finally
, содержащий программный код, выполняющий заключительные операции, который гарантированно выполняется независимо от того, что происходит в блоке
try
. И блок
catch
, и блок
finally
не являются обязательными, однако после блока
try
должен обязательно присутствовать хотя бы один из них. Блоки
try, catch
и
finally
начинаются и заканчиваются фигурными скобками. Это обязательная часть синтаксиса, и она не может быть опущена, даже если между ними содержится только одна инструкция.
Следующий фрагмент иллюстрирует синтаксис и назначение инструкции
try/catch/finally
:
try {
// Обычно этот код без сбоев работает от начала до конца.
// Но в какой-то момент в нем может быть сгенерировано исключение
// либо непосредственно с помощью инструкции throw, либо косвенно -
// вызовом метода, генерирующего исключение.
}
catch (е) {
// Инструкции в этом блоке выполняются тогда и только тогда, когда в блоке try
// возникает исключение. Эти инструкции могут использовать локальную переменную е,
// ссылающуюся на объект Error или на другое значение, указанное в инструкции throw.
// Этот блок может либо некоторым образом обработать исключение, либо
// проигнорировать его, делая что-то другое, либо заново сгенерировать
// исключение с помощью инструкции throw.
}
finally {
// Этот блок содержит инструкции, которые выполняются всегда, независимо от того,
// что произошло в блоке try. Они выполняются, если блок try завершился:
// 1) как обычно, достигнув конца блока
// 2) из-за инструкции break, continue или return
// 3) с исключением, обработанным приведенным в блоке catch выше
// 4) с неперехваченным исключением, которое продолжает свое
// распространение на более высокие уровни
}
Обратите внимание, что за ключевым словом catch следует идентификатор в скобках. Этот идентификатор похож на параметр функции. Когда будет перехвачено исключение, этому параметру будет присвоено исключение (например, объект
Error
). В отличие от обычной переменной идентификатор, ассоциированный с конструкцией