#matlab
#matlab
Вопрос:
Я пытаюсь перехватить предупреждающее сообщение в функции (testA), встроенной в другую функцию (TestB), которая также содержит предупреждающее сообщение. Когда я пытаюсь перехватить предупреждающее сообщение в testA, переменная ME не генерируется. Для упрощения я определил оба теста:
function testA()
warning('testA');
testB();
end
TestB
function testB()
warning('testB');
end
Я уже пробовал :
w = warning ('off','all');%%
try
testA()
catch ME
assert(length(ME.message) > 0)
end
w = warning ('on','all');
а также lastwarn
lastwarn('');
% Do your fitting
testA()
% Check which warning occured
[msgstr, msgid] = lastwarn;
switch msgid
case 'testA'
error(msgstr);
end
Но я получил последнее предупреждающее сообщение, которое является ‘TestB’ в msgstr, и мне нужно получить предупреждающее сообщение ‘Test A’.
Есть идеи?
Спасибо за вашу помощь.
Ответ №1:
Вы не можете сделать это хорошо программно. Предупреждения на самом деле не предназначены для потока управления.
Вы не можете перехватывать предупреждения с try
помощью / catch
. Это только для ошибок (они же «исключения»).
Если это ваш код, лучше всего изменить testB
его так, чтобы он возвращал дополнительный выходной аргумент о предупреждениях, которые он вызвал, или условиях, обозначенных этими предупреждениями. Затем попросите testA
передать их в некоторой структуре в другом выходном аргументе.
Если вы просто пытаетесь остановиться на предупреждении в отладчике, вы можете сделать это, добавив идентификаторы к своим предупреждениям, отключив только один из testA
них, а затем выполнив dbstop if warning
.
function testA()
warning('myproject:TestA', 'testA');
testB();
end
function testB()
warning('myproject:TestB', 'testB');
end
Затем:
warning off myproject:TestA
dbstop if warning
testA
Если вы действительно хотите программно получить предупреждение, используйте тот же подход добавления идентификаторов к вашим предупреждениям, отключите just myproject:TestA
, а затем используйте lastwarn
для получения предупреждения, которое возникает.