Всем привет!
Достаточно много возился в эти выходные со скриптами на 29 релизе (впрочем, пробовал и предыдущие), столкнулся с такой неприятной штукой.
Если при вызове метода/макроса (далее - просто метод) одного скрипта из другого скрипта в вызываемом методе вызвано исключение (брошено явно или неявно), то в вызывающем методе это исключение при помощи конструкции try {} catch (e) {} никак не поймать
В итоге оно всплывает на самый верх и нам всплывает стандартное окно с исключением и предложением запустить отладчик.
Кто-нибудь сталкивался с этим? Нашли какое-нибудь решение?
Саша, не подскажешь, есть ли возможность поймать исключение в описанной ситуации?
Для того, чтобы воспроизвести ситуацию прилагаю код простейших скриптов:
lib.js - скрипт, чей метод вызывается из другого скрипта
Код:
$engine JScript
$uname testExceptionsLib
function throwErrorFunction()
{
throw "Excepiton from testExceptionsLib.throwErrorFunction()";
}
function macrosThrowErrorMacros()
{
throw "Excepiton from testExceptionsLib.throwErrorMacros()";
}
app.js - скрипт, в макросе которого вызываем метод из lib.js и пытаемся обработать его исключение
Код:
$engine JScript
$uname testExceptionsApp
var lib = addins.byUniqueName("testExceptionsLib");
function macrosИсключениеПриВызовеФункции()
{
try
{
lib.object.throwErrorFunction();
}
catch (e)
{
Message("Gotcha: " + e.text);
}
}
function macrosИсключениеПриПрограммномВызовеМакроса()
{
try
{
lib.invokeMacros("ThrowErrorMacros");
}
catch (e)
{
Message("Gotcha: " + e.text);
}
}
p.s.
В порыве экспериментов я начерно портировал JsUnit (
http://jsunit.net) под Снегопат и даже "нарисовал" простейший запускатель тестов, и оно даже работает, за исключением того, что первый же сломавшийся тест останавливает выполнение всех тестов из-за озвученной проблемы (assert'ы бросают исключения).