2014-10-27 3 views
0

Я вызываю функцию fit_circle, которая может или не может вызвать процедуру MESSAGE. fit_circle вызывает функцию poly_fit, которая может вызывать процедуру MESSAGE, но также иногда производит математическую ошибку (я ничего не могу с этим поделать).Как правильно реализовать обработку ошибок?

Можно ли обработать обработчик ошибок, который позаботится обо всех этих сценариях, не возвращаясь к интерактивной подсказке? Я пробовал следующее:

FUNCTION arb_funct,circular_data 
    CATCH, ERROR 
    IF ERROR NE 0 THEN BEGIN 
     CATCH, /CANCEL 
     print, 'An Error Occured' 
     return, [] 
    ENDIF 

    circle_fit_result = fit_circle(circular_data) 
    return, circle_fit_result 
END 

Однако обработчик ошибок никогда не запускается. documentation только упоминает поиск обработчиков ошибок, определенных в процедурах.

+0

Не могли бы вы показать код 'FIT_CIRCLE'? – mgalloy

+0

Не могли бы вы добавить трассировку стека (сообщения об ошибках), которые отображаются, когда программа не выполняет MAIN? –

ответ

1

Работы для меня. Вот мой пример кода:

pro mg_error_demo_helper2 
    compile_opt strictarr 

    a = b 
end 


pro mg_error_demo_helper1 
    compile_opt strictarr 

    mg_error_demo_helper2 
end 


pro mg_error_demo 
    compile_opt strictarr 
    catch, error 
    if (error ne 0L) then begin 
    catch, /cancel 
    print, 'An error occurred' 
    return 
    endif 

    mg_error_demo_helper1 
end 

Когда я бегу, я получаю:

IDL> mg_error_demo 
% Compiled module: MG_ERROR_DEMO. 
error happened 
+0

Я думаю, проблема в том, что я использую функцию, а не процедуру. К сожалению, я не могу контролировать это. – maxf130

+0

@mgalloy - Как вы получаете сообщение об ошибке 'error happenend'? Я не вижу этого в вашем коде. Я что-то пропустил? –

+0

@ maxf130 - Я использовал инструкции CATCH в FUNCTIONs, так что это не проблема. Вам просто нужно указать значение для оператора RETURN. –

0

Вот пример того, что я говорил:

FUNCTION some_function 

;;-------------------------------------------------------------------------- 
;; Error handling [put towards beginning of routine] 
;;-------------------------------------------------------------------------- 
CATCH, error_status 
IF (error_status NE 0) THEN BEGIN 
    ;; Cancel error handler 
    CATCH, /CANCEL 
    ;; Print error message 
    PRINT, 'Error index: ', error_status 
    PRINT, 'Error message: ', !ERROR_STATE.MSG 
    ;; Define return variable or how to handle error 
    ;; --> I usually use a formatted output consistent with the expected 
    ;;  output, but here I will just use 0 for example. 
    dumb   = 0 
    ;; Return defined variable 
    RETURN,dumb 
ENDIF 

;;-------------------------------------------------------------------------- 
;; Main body of routine 
;;-------------------------------------------------------------------------- 
blah = 0 
; blah 
; blah 
; blah 

;;-------------------------------------------------------------------------- 
;; Return to user 
;;-------------------------------------------------------------------------- 

RETURN,return_variable 
END 

Надежда, что помогает .. .

1

IDL имеет три разных типа «уловимых» ошибок:

  • «Обычные» ошибки: Это наиболее распространенный тип ошибок для обработки. Они бросаются, когда вызывается message. Используйте catch или on_error, чтобы иметь дело с ними.
  • IO Errors: Это происходит, когда происходит преобразование, чтение диска, память или другая ошибка «IO». Обычно они также будут пойманы catch и on_error. Когда это не так, используйте on_ioerror, чтобы справиться с ними.
  • Ошибки в математике: Это происходит, когда вы делите на 0, выполняете определенную математику с NaN или бесконечность и т. Д. Поделитесь ими с помощью check_math и !except.

Вот пример использования всего три в одной программе:

function arb_funct, circular_data 

    ; handle normal errors 
    catch, error 
    if error ne 0 then begin 
     catch, /cancel 
     print, 'A normal error occured: ' + !error_state.msg 
     return, [] 
    endif 

    ; handle IO errors 
    on_ioerror, arb_funct__ioerror 
    if 0B then begin 
     arb_funct__ioerror: 
     print, 'An IO error occured: ' + !error_state.msg 
     return, [] 
    endif 

    ; clear math errors from previous routines 
    math_err = check_math(/print) 
    previous_except = !except 
    !except = 0 

    ; do stuff 
    circle_fit_result = fit_circle(circular_data) 

    ; handle math errors 
    math_err = check_math() 
    !except = previous_except 
    if math_err ne 0 then begin 
     print, 'A math error occured: ' + strtrim(math_err, 1) 
     return, [] 
    endif 

    ; and finally return 
    return, circle_fit_result 
end 
Смежные вопросы