2013-09-26 1 views
1

У меня есть следующий процесс, который в основном смотрит вверх по паре значений в диктаторе и возвращает их в виде списка.Проблема с уловкой в ​​простой tcl proc

proc GetAllow { PID Ply } { 

# read a dictonary from a file 
catch { 

append PlyAndDirXt $Ply "_xt" 
append PlyAndDirYt $Ply "_yt" 

set x_allow_tens [ dict get $allowables $PID $PlyAndDirXt ] 
set y_allow_tens [ dict get $allowables $PID $PlyAndDirYt ] 
set allowables [ list $x_allow_tens $y_allow_tens ] 

} res 

if { $res == 0 } { 
    return $allowables 
} 
if { $res != 0 } { 
    return 999 
}  

}

Как я понимаю, "поймать", если все в порядке $ Рез должен быть 0 = TCL_OK. В этом случае я бы хотел, чтобы proc возвращал список $ allowables. Если значения не найдены в dict из-за отсутствия соответствующих ключей. Я бы хотел, чтобы он вернул 999. Но я всегда возвращаю 999. Что я здесь делаю неправильно?

ответ

4

В соответствии с manual:

Если скрипт выдает ошибку, улов будет возвращать целочисленное значение, отличное от нуля, соответствующего исключительного кода возврата, возвращаемого оценки сценария. Tcl определяет нормальный код возврата из оценки сценария равным нулю (0) или TCL_OK.

Если аргумент varName задан, то переменная, которую он называет, устанавливается на результат оценки скрипта. Когда код возврата из сценария равен 1 (TCL_ERROR), значение, хранящееся в varName, является сообщением об ошибке. Когда код возврата из сценария равен 0 (TCL_OK), значение, хранящееся в resultVarName, является значением, возвращаемым из сценария.

Таким образом, $res не будет равна 0, если результат вашего сценария возвращает 0.

Вы можете установить catch переменной, как это:

set err [catch { 

    append PlyAndDirXt $Ply "_xt" 
    append PlyAndDirYt $Ply "_yt" 

    set x_allow_tens [ dict get $allowables $PID $PlyAndDirXt ] 
    set y_allow_tens [ dict get $allowables $PID $PlyAndDirYt ] 
    set allowables [ list $x_allow_tens $y_allow_tens ] 

} res] 

Затем проверьте

if { $err == 0 } { 
    return $allowables ;# Or return $res since that's the last evaluated line 
} 
if { $err != 0 } { 
    return 999 
}