TCL script try catch

1

Eu tenho um script TCL que define um número de variáveis e lê vários arquivos. O último arquivo que ele lê pode conter informações confidenciais, portanto, preciso garantir que esse arquivo seja excluído, mesmo que ocorra um erro no início do script:

#!/usr/bin/expect -f

set timeout 5

set foo [lindex $argv 0]
set bar [lindex $argv 1]
set secret [lindex $argv 2]

if { ! ([file exists "$foo"] && [file executable "$foo"]) } {
    puts stderr "$foo does not exist or is not executable"
    exit 2
}

if { ! ([file exists "$bar"] && [file executable "$bar"]) } {
    puts stderr "$bar does not exist or is not executable"
    exit 3
}

if { ! ([file exists "$secret"] && [file readable "$secret"]) } {
    puts stderr "$secret does not exist or is not readable"
    exit 4
}

#Read secret, do foo, do bar, etc.

file delete $secret

Analisando tente acho que posso fazer isso:

try {
    set foo [lindex $argv 0]
    set bar [lindex $argv 1]
    set secret [lindex $argv 2]

    if { ! ([file exists "$foo"] && [file executable "$foo"]) } {
        puts stderr "$foo does not exist or is not executable"
        exit 2
    }

    if { ! ([file exists "$bar"] && [file executable "$bar"]) } {
        puts stderr "$bar does not exist or is not executable"
        exit 3
    }

    if { ! ([file exists "$secret"] && [file readable "$secret"]) } {
        puts stderr "$secret does not exist or is not readable"
        exit 4
    }

    #Read the file, do foo, do bar, etc.

    file delete $secret
} on error {
    file delete $secret
    exit
}

Mas eu não estou familiarizado com a sintaxe do TCL e tendo dificuldade em encontrar coisas na documentação. Isso funcionará ou preciso alterar on error para on error {result options} ? Nesse caso, o que é result e options ? Ou preciso usar trap ?

    
por David Kennedy 28.08.2014 / 04:49

1 resposta

3

Na documentação do Tcl, os elementos opcionais se parecem com ?this? : example de link mostrando que os manipuladores e cláusulas "finally" são opcionais:

try body ?handler...? ?finally script?

Na cláusula on , variableList não é opcional, mas você pode fornecer uma lista vazia. Se você fornecer {result options} , result é a mensagem de erro (para humanos) e opções é um dicionário que contém informações específicas sobre o erro (veja o retorne página man para detalhes).

Para reduzir a duplicação de código, use o bloco finally

try {
    # your code here
} on error {} {
    exit
} finally {
    file delete $secret
} 
    
por 28.08.2014 / 12:21