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
, чтобы воспроизвести захваченную ошибку.
Ошибки, которые происходят во время выполнения функций ядра, имеют различные коды ошибок, в зависимости от проблемы. Например, “Division by zero
” производит код ошибки 1025:
y := 1/x: traperror(subs(y, x = 0))
lasterror()
Error: Division by zero. [_power]
Повышенное использование всех ошибок функционального error
имеет код ошибки 1028
. Ошибки во время выполнения библиотечных функций являются этим видом:
traperror(error("My error!"))
lasterror()
Error: My error!
Мы пытаемся учесть полином, но сдаться после десяти секунд:
traperror(factor(x^1000 + 4*x + 1), 10)
lasterror()
Error: Execution time exceeded; Evaluating: faclib::univ_mod_gcd
Для использования в других стандартных программах желательно использовать 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))
Здесь у нас есть два вложенных вызова traperror
. Внутренний вызов содержит неотключенный цикл, и внешний вызов имеет ограничение по времени секунд 2
. Когда время выполнения превышено, эта специальная ошибка не захватывается внутренним вызовом traperror
. Из-за ошибки никогда не выполняется print(1)
:
traperror((traperror((while TRUE do 1 end)); print(1)), 2)
lasterror()
Error: Execution time exceeded.
|
Любой объект MuPAD |
|
Ограничение по времени: положительное целое число |
|
Предел выполнения: положительное целое число |
Неотрицательное целое число.