2016-08-31 6 views
0

Ich habe nicht viel Erfahrung mit IDL, aber ich muss einen Fehler beheben, wo in der Kompilierung Fehlerstatus an das aufrufende Skript zurückgegeben werden muss.IDL-Kompilierung gibt Fehlerstatus nicht zurück

cat <<ENDCAT> something.pro 

    PRINT, "Start" 

    PRINT, "Compiling functions needing early compile" 
    @do_early_func 

    PRINT, "Compiling remaining functions" 
    @do_other_func 

    PRINT, "Running: resolve_all" 
    resolve_all 

    EXIT 

    ENDCAT 

    setenv IDL_STARTUP something.pro 

    $IDL_DIR/bin/idl 

Der obige Inhalt besteht in einem Skript make_program genannt, die durch ein anderes Skript aufgerufen wird aufgerufen, die build_script

Das Problem i ist vor, dass selbst wenn ‚resolve_all‘ führt zu einer Kompilation Scheitern , das make_program gibt immer ein wahr an die build_script macht es denken, dass die Kompilierung erfolgreich war, als es tatsächlich nicht tat. Wie kann ich den Fehlerstatus zurück an das aufrufende Skript zurückgeben?

Antwort

0

Die EXIT Routine hat ein STATUS Schlüsselwort, das den Exit-Status des Skripts zurückgeben kann. So etwas wie:

exit, status=status_code 

Um festzustellen, ob RESOLVE_ALL richtig abgeschlossen ist, können Sie einen CATCH Block tun müssen. Der einfachste Weg ist wahrscheinlich, RESOLVE_ALL in Ihre eigene Routine zu verpacken, die ein Schlüsselwort hat, das zurückgibt, ob das RESOLVE_ALL erfolgreich war.

0

Ich bin mir nicht sicher, wo ich diese abgeholt, aber Sie werden zwei Routinen benötigen:

function validate_syntax_helper, routineName 

    compile_opt strictarr, hidden 

    catch, error 
    if (error ne 0) then return, 0 

    resolve_routine, routineName, /either, /compile_full_file 
    return, 1 

end 

und

function validate_syntax, routineName 

    compile_opt strictarr, hidden 

    oldquiet = !quiet 
    !quiet = 1 

    catch, error 
    if (error ne 0) then return, 0 

    ; Get current directory 
    cd, current=pwd 

    o = obj_new('IDL_IDLBridge') 
    o->execute, '@' + pref_get('IDL_STARTUP') 
    ; Change to current directory 
    o->execute, 'cd, ''' + pwd + '''' 
    ; Validate syntax 
    cmd = 'result = validate_syntax_helper(''' + routineName + ''')' 
    o->execute, cmd 
    result = o->getVar('result') 
    obj_destroy, o 

    !quiet = oldquiet 

    return, result 

end 

Sie dann validate_syntax nennen, die 1 zurückgibt, wenn es kompilieren und 0 wenn es nicht geht. Ich denke nicht, dass dies von der virtuellen IDL-Maschine verwendet werden kann, da es execute verwendet, aber das ist Ihnen vielleicht egal. Sie müssen dies manuell für alle Ihre Routinen ausführen, um kompiliert zu werden, anstatt resolve_all auszuführen.

Verwandte Themen