Как перехватывать предупреждающие сообщения в функции, встроенной в другую функцию в matlab

#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 для получения предупреждения, которое возникает.