Обработайте ошибки

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Как правило, когда процедура MuPAD® сталкивается с ошибкой, вызванной оценкой объекта, процедура останавливается, система возвращается к интерактивному уровню и отображает сообщение об ошибке. Если вы не хотите отключать процедуру, используйте функцию traperror, чтобы зафиксировать ошибку.

Функция traperror возвращает код ошибки вместо самой ошибки. Позже, можно воспроизвести ошибку при помощи функции lasterror. Эта функция производит последнюю ошибку, которая произошла на текущем сеансе MuPAD. Если вы вызываете lasterror в операторе или процедуре, он отключает тот оператор или процедуру. Если вы хотите отобразить сообщение об ошибке, не выдавая саму ошибку, сохранить код ошибки, возвращенный traperror, и затем получить сообщение при помощи функции getlasterror.

Например, функциональный f выдает ошибку, когда sin (π   k) равен нулю:

f := (k) -> 1/sin(PI*k)

f(1)
Error: Division by zero. [_invert]
  Evaluating: f

Предположим, что вы хотите вычислить f для значений - π ≤ k ≤ π увеличение значения k на каждом шаге. Чтобы вызвать функциональный f для всех необходимых значений, создайте цикл for. Когда вы пытаетесь выполнить этот оператор, он останавливается, как только функциональный f сталкивается с делением на нуль впервые. Чтобы постараться не отключать оператор for, используйте функцию traperror, чтобы зафиксировать ошибку. Чтобы отобразить текст того сообщения об ошибке, не прерывая выполнение оператора for, используйте getlasterror ():

for k from -1 to 1 step 1/4 do
  err := traperror(f(k)):
  if err = 0 then
    print(Unquoted, "k = ".expr2text(k), "f = ".expr2text(f(k)))
  else 
    print(Unquoted, "k = ".expr2text(k), getlasterror())
  end_if
end_for
k = -1, [1025, Error: Division by zero. [_invert]]
                 Evaluating: f
k = -3/4, f = -2^(1/2)
k = -1/2, f = -1
k = -1/4, f = -2^(1/2)
k = 0, [1025, Error: Division by zero. [_invert]]
                Evaluating: f
k = 1/4, f = 2^(1/2)
k = 1/2, f = 1
k = 3/4, f = 2^(1/2)
k = 1, [1025, Error: Division by zero. [_invert]]
                Evaluating: f

Для ошибок, созданных с функцией error, включая ваши пользовательские сообщения об ошибке, traperror всегда возвращает код ошибки 1028. Если сообщение об ошибке с кодом 1028 является последним сообщением об ошибке, которое произошло на сеансе MuPAD, можно получить то сообщение об ошибке при помощи lasterror или getlasterror. Например, создайте процедуру g, который вычисляет факториал любого номера меньше чем 10. Если вы передаете номер, больше, чем 10 к этой процедуре, процедура сокращает количество к 10, и затем вычисляет факториал:

g := proc(n:Type::PosInt)
local test;
begin
  test := proc()
    begin
      if n > 10 then
        error("The number must not exceed 10.")
      end_if
  end_proc:
  if traperror(test(n)) <> 0 then
    g(n - 1)
  else
    n!
  end_if;
end_proc:

Вызовите процедуру с номером 100. В течение времени выполнения процедура сталкивается с ошибкой, но не останавливается. Это также не отображает сообщение об ошибке. Вместо этого это возвращает результат:

g(100)

Чтобы получить и отобразить сообщение об ошибке, отловленное во время осуществления процедуры g, используйте функцию lasterror:

lasterror()
Error: The number must not exceed 10. [test]

Чтобы отобразить код ошибки и текст того сообщения, используйте функцию getlasterror:

g(100):
getlasterror()