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
вызовите, который установил ограничение по времени. См. Пример 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 |
|
Ограничение по времени: положительное целое число |
|
Предел выполнения: положительное целое число |
Неотрицательное целое число.