traperror

Захватите ошибки

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

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

Синтаксис

traperror(object)
traperror(object, t)
traperror(object, MaxSteps = s)

Описание

traperror(object) захватывает ошибки, произведенные оценкой object.

traperror(object, t) делает то же самое. Кроме того, это останавливает оценку, если это не закончено после реального времени секунд t.

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

traperror возвращает код ошибки 0, если никакой ошибки не произошло. Кодом ошибки является 1320, если данное ограничение по времени, t превышен (“Execution time exceeded”) и 1321, если данное количество “шагов выполнения” превышено. Кодом ошибки является 1028, если ошибка была повышена командой error.

Если traperror вызван числовым вторым аргументом, этот номер взят в качестве ограничения по времени, измеренного в секундах, “времени процесса” (см. документацию функции time для обсуждения этого термина).

При использовании опции MaxSteps = s вызывающая сторона устанавливает ограничение по времени, которое не системно-зависимо, а скорее измеренное с точки зрения шагов оценки MuPAD.

s номера не относится непосредственно к шагам оценки, а скорее к фиксированному (большому) количеству шагов, которые могут измениться от одного релиза MuPAD до следующего, но фиксируются в рамках одного релиза. Номер s является дважды количеством выходных параметров, вызванных Pref::report(9) для вычисления с помощью максимального позволенного времени.

Если у traperror нет времени, предельный набор и ошибка “Execution time exceeded” повышены включением команда traperror(..., t), то эта ошибка не захватывается внутренним traperror. Это захватывается вызовом traperror, который установил ограничение по времени. Cf. Пример 5.

Объект может быть присвоением, которое, по синтаксическим причинам, должно быть заключено в дополнительные скобки. Следующий фрагмент кода демонстрирует типовое приложение traperror:

   if traperror((x := SomeErrorProneFunction())) = 0 then
        DoSomethingWith(x);
   else RespondToTheError();
   end_if;

Используйте lasterror, чтобы воспроизвести захваченную ошибку.

Примеры

Пример 1

Ошибки, которые происходят во время выполнения функций ядра, имеют различные коды ошибок, в зависимости от проблемы. Например, “Division by zero” производит код ошибки 1025:

y := 1/x: traperror(subs(y, x = 0))

lasterror()
Error: Division by zero. [_power]

Пример 2

Повышенное использование всех ошибок функционального error имеет код ошибки 1028. Ошибки во время выполнения библиотечных функций являются этим видом:

traperror(error("My error!"))

lasterror()
Error: My error!

Пример 3

Мы пытаемся учесть полином, но сдаться после десяти секунд:

traperror(factor(x^1000 + 4*x + 1), 10)

lasterror()
 Error: Execution time exceeded;   Evaluating:
faclib::univ_mod_gcd 

Пример 4

Для использования в других стандартных программах желательно использовать MaxSteps вместо ограничения по времени, достигать сопоставимых результатов через медленнее и более быстрые машины:

traperror(factor(x^1000 + 4*x + 1), MaxSteps=10)

lasterror()
 Error: Execution MaxSteps exceeded [traperror];
  Evaluating: faclib::ddf 

Обратите внимание на то, что шаги оценки могут занять весьма различное количество времени, поэтому даже на той же машине, различные выражения, выполненные с тем же значением MaxSteps, могут быть отключены после совсем других отрезков времени:

time(traperror(factor(x^1000 + 4*x + 1), MaxSteps=1));
time(traperror(while TRUE do 1 end_while, MaxSteps=1));
time(traperror(int(1/sqrt(1/r-1/r0), r=0..r0), MaxSteps=1))

Пример 5

Здесь у нас есть два вложенных вызова traperror. Внутренний вызов содержит неотключенный цикл, и внешний вызов имеет ограничение по времени секунд 2. Когда время выполнения превышено, эта специальная ошибка не захватывается внутренним вызовом traperror. Из-за ошибки никогда не выполняется print(1):

traperror((traperror((while TRUE do 1 end)); print(1)), 2)

lasterror()
Error: Execution time exceeded.

Параметры

object

Любой объект MuPAD

t

Ограничение по времени: положительное целое число

s

Предел выполнения: положительное целое число

Возвращаемые значения

Неотрицательное целое число.

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

Функции MuPAD