2012-05-07 5 views
0

Я пытаюсь захватить строки с расчетами в текстовом документе
и выполнить их.Если сообщение об ошибках соответствует эхо-строке

Я использую это в моей функции:

for i in range(startline,endline) 
let calculation = getline(i) 
... 
let out = eval(calculation) 
... 
endfor 

иногда что-то пойдет не так, и я получаю это сообщение:

Error detected while processing function.... 
Line ... 
E488: Trailing Characters 

линия .. это линия-номер в моей функции.
Я хотел бы также знать, какие вычисления это касается (какой строки в моем текстовом документе):

Если обнаружена ошибка = эхо расчета

Как я могу проверить, есть ли сообщение об ошибке и эхо переменного " расчет "?

ответ

2

Есть два способа обработки ошибок сценария внутри функции:

Первого подавляющие ошибки через :silent!. Два недостатка: вам нужно вручную проверить успех, и любой нормальный вывод из оцененного сценария также подавляется (если вы не делаете искажений с :unsilent).

let v:errmsg = '' 
silent! let out = eval(calculation) 
if v:errmsg != '' 
    " error 
endif 

Я бы рекомендовал второй путь через Try ... Catch, что позволяет избежать проблем с выходом и явного проверить ошибки:

try 
    let out = eval(calculation) 
catch /^Vim\%((\a\+)\)\=:E/ 
    " v:exception contains what is normally in v:errmsg, but with extra 
    " exception source info prepended, which we cut away. 
    let v:errmsg = printf("Line: %d\nCalculation: %s\nError: %s", i, calculation, substitute(v:exception, '^Vim\%((\a\+)\)\=:', '', '')) 
    echohl ErrorMsg 
    echomsg v:errmsg 
    echohl None 
endtry 
+0

спасибо очень Инго. Я адаптировал ваше 2-е решение. Только одна мелочь. Я добавил ': continue' под' echohl None', чтобы перейти к следующему циклу. Я хочу, чтобы сообщения об ошибках отображались в конце функции (после того, как все сделано). Это возможно? – remio

+0

@remio: Конечно. Инициализируйте список через 'let errors = []' перед циклом. Затем вместо присвоения 'v: errmsg', do' call add (errors, printf (...)) '. Наконец, после цикла распечатайте список либо через «echo join (ошибки,« \ n »)», либо явно итерацию через «для ошибки в ошибках». –

+0

Ingo Karkat, спасибо вам большое! – remio

Смежные вопросы