# try

начало блока try в управляющей структуре try-catch

# catch

начало блока catch в управляющей структуре try-catch

## Последовательность вызова

                try
                statements
                catch
                statements
                end

## Описание

Управляющая структура `try`-`catch` может быть использована для управления кодом программы, который может формировать ошибки.

Когда исполняется управляющая структура `try`-`catch`, то обычно исполняются только инструкции между ключевыми словами `try` и `catch`. Однако, если возникает ошибка во время выполнения любой из этих инструкций, то ошибка записывается, оставшиеся инструкции вплоть до ключевого слова `catch` пропускаются, и исполняются инструкции между ключевыми словами `catch` и `end`, используя режим обработки ошибок по умолчанию (см. errcatch).

Записанная ошибка может быть извлечена с помощью функции lasterror.

Инструкции блока `catch`, как и само ключевое слово `catch`, могут быть опущены, если нет альтернативных инструкций.

Заметьте, что можно также использовать функцию execstr с аргументом `'errcatch'` для обработки ошибок. Это может быть особенно полезным для обработки синтаксических ошибок.

Заметьте также, что управляющая структура `try-catch` в некотором роде похожа на:

    if execstr("<try instructions>","errcatch")<>0 then
      <catch instructions>
    end

Она использует тот же внутренний механизм, что и errcatch. Именно по этой причине errcatch или execstr(...,"errcatch") не могут быть включены в управляющую структуру `try`-`catch`. Этот контекст обнаруживается и формируется особое сообщение об ошибке (эта ошибка отлавливается и хранится как и любая другая ошибка, если на неё поставлена ловушка в блоке `try`).

Тем не менее управляющие структуры `try`-`catch` могут быть вложены друг в друга (см. пример 2 ниже).

## Примеры

    // Пример 1
    file_path=TMPDIR+'/wrong'
    try
      u=mopen(file_path,'r')
      x=mget(10,'c',u)
    catch
      disp(['файл '+file_path+ ' нельзя прочитать используя значения по умолчанию для x'])
      x=1:10
    end
     [error_message,error_number]=lasterror(%t)

    // Пример 2 (вложенные структуры try/catch)
    function nestedtry(a,b)
    disp("СТАРТ")
    mprintf("\ta имеет значение: %s\t\tb имеет значение: %s\n",string(a),string(b))
    try
      disp("try 1")
      try
        disp("try 2")
        z=a+1;  // ошибка, если значение строковое
      catch
        disp("catch 2")
        t=b+1;  // ошибка, если значение строковое
      end
      disp("после try 2")
    catch
      disp("catch 1")
    end
    disp("после try 1 - КОНЕЦ")
    endfunction
    nestedtry(1,1)
    nestedtry("строка",1)
    nestedtry(1,"строка")
    nestedtry("строка","строка")

## Смотрите также

- error
- execstr
- if
- lasterror
- errcatch