2016-08-31 48 views
0

我沒有太多的IDL經驗,但我需要修復編譯失敗狀態需要返回到調用腳本的錯誤。IDL編譯不會返回失敗狀態

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 

以上內容存在於一個名爲make_program這是由其他腳本調用腳本稱爲build_script

我現在面臨的問題是,即使「resolve_all」在編譯失敗結果,make_program總是返回true以致於build_script使它認爲編譯成功時,它實際上沒有。我如何將失敗狀態返回給調用腳本?

回答

0

EXIT例程有一個STATUS關鍵字,它可以返回腳本的退出狀態。因此,像:

exit, status=status_code 

要確定是否RESOLVE_ALL正確完成,你可能需要做一個CATCH塊。最簡單的方法可能是將RESOLVE_ALL包裝在您自己的例程中,該例程具有ERROR關鍵字,該關鍵字返回RESOLVE_ALL是否成功。

0

我不知道我就撿起那裏,但你需要兩個程序:

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 

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 

然後調用validate_syntax,它返回1時,它可以編譯和0當它不能。我不認爲這可以從IDL虛擬機使用,因爲它使用execute,但可能對您無關緊要。您必須在所有要編譯的例程上手動運行此代碼,而不是運行resolve_all