parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Брэйк для выхода из метода ^table.menu

AleXp 25.09.2005 15:49

Чего соорудил-то:
@GetDirIndex[pathToDir][_tableIndex;_flagZero]
##################################
# Возвращает имя индексного файла каталога.
#
#    string
#    GetDirIndex[
#        string pathToDir;
#    ]

$pathToDir[^pathToDir.trim[end;/]]

$_tableIndex[^table:create{path
index.htm
index.php
index.phtml
index.shtml
default.html
default.htm
index.html
default.php
default.phtml
default.shtml
main.html
main.htm
main.php
main.shtml
main.phtml}

# Флаг для принудительного вызова ошибки "деление на ноль"
$_flagZero(0)

^try{
        ^_tableIndex.menu{

                ^try{
                        $_flagZero(1)
                        ^file::load[binary;$pathToDir/$_tableIndex.path]
                }{
# Данный блок срабатывает при возникновении ошибки file.access или file.missing
                        $exception.handled(1)
                        $_flagZero(0)
                }
# Если индексный файл найден, то принудительно вызываем ошибку для выхода из метода .menu
        ^eval(1/($_flagZero-1))

        }
}{
# Обработка ошибки number.zerodivision и присвоение выходного значения оператору @GetDirIndex[]
        $exception.handled(1)
        $result[$_tableIndex.path]
}
#end @GetDirIndex[]
Как ни странно, но всё работает :) Фишка в том, что производится аварийный выход из метода ^table.menu{}, но в $_tableIndex.path сохраняется указатель на "правильный" индексный файл директории, который и используется в качестве результаты работы всего оператора.

Вопрос к Создателям:

1. Так допустимо делать? Или этот финт можно отнести к "недокументированным особенностям" и в любой момент все имеет право перестать работать?

2. Оператор ^try внутри другого оператора ^try ? Это не криминал, при условии, что логика программы гарантирует обработку всех искусственно вызванных ошибок...