При работе с синхронными ошибками выполнения для их перехвата используются инструкции
try..catch..finally
. Когда возникает ошибка выполнения, среда выполнения Flash генерирует исключение. Это означает, что нормальное выполнение программы приостанавливается, и создается специальный объект типа Error. Затем объект Error отправляется в первый доступный блок
catch
.
Инструкция
try
закрывает группу инструкций, которые потенциально могут создавать ошибки. Инструкция
catch
всегда используется с инструкцией
try
. Если обнаруживается ошибка в одной из инструкций блока
try
, начинается выполнение инструкций
catch
, которые прикреплены к данной инструкции
try
.
Инструкция
finally
закрывает инструкции, которые будут выполняться при возникновении ошибки в блоке
try
или нет. Если ошибки нет, инструкции внутри блока
finally
выполняются после завершения выполнения инструкций блока
try
. Если ошибка есть, сначала выполняется соответствующая инструкция
catch
, затем — инструкции блока
finally
.
Следующий код демонстрирует синтаксис для использования инструкций
try..catch..finally
:
try
{
// some code that could throw an error
}
catch (err:Error)
{
// code to react to the error
}
finally
{
// Code that runs whether an error was thrown. This code can clean
// up after the error, or take steps to keep the application running.
}
Каждая инструкция
catch
идентифицирует специфический класс того исключения, которое он обрабатывает. Инструкция
catch
может задавать только те подклассы ошибок, которые принадлежат к классу Error. Каждая инструкция
catch
проверяется по порядку. Выполняется только первая инструкция
catch
, которая соответствует типу генерируемой ошибки. Другими словами, если проверяется сначала класс Error высшего уровня, а затем подкласс класса Error, тогда выбран будет только класс Error высшего уровня. Эту систему иллюстрирует следующий код:
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:Error)
{
trace("<Error> " + error.message);
}
catch (error:ArgumentError)
{
trace("<ArgumentError> " + error.message);
}
Выше приведенный код отображает следующий вывод:
<Error> I am an ArgumentError
Чтобы корректно перехватить ошибку ArgumentError, наиболее специфические типы ошибок должны быть перечислены в начале, а наиболее общие — в конце, как показано в следующем примере:
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:ArgumentError)
{
trace("<ArgumentError> " + error.message);
}
catch (error:Error)
{
trace("<Error> " + error.message);
}
Некоторые методы и свойства в API-интерфейсе ActionScript генерируют ошибки выполнения, если они сталкиваются с ошибками во время работы. Например, метод
close()
в классе Sound генерирует ошибку IOError, если он (метод) не в состоянии закрыть аудиопоток, как демонстрируется в следующем коде:
var mySound:Sound = new Sound();
try
{
mySound.close();
}
catch (error:IOError)
{
// Error #2029: This URLStream object does not have an open stream.
}
Изучив
cправочник ActionScript® 3.0 для платформы Adobe® Flash® Platform
, вы обратите внимание на то, какие методы генерируют исключения. Это детально описано для каждого метода.