То, что вы хотите, это эквивалент из CTRL-C, но быть выполняется с помощью команды вместо фактического пользователя нажатия клавиши. Использование Java Robot для имитации этого нажатия клавиши было suggested by @yuk. Этот метод был хорошо использован @Pursuit в его функции под названием terminateExecution
. Еще одно решение на основе Java, interrupt
было предложено компанией @MattB.
Чтобы эффективно использовать terminateExecution
, я нахожу, что необходимо коротко позвонить по телефону pause
, чтобы дать время Java для отправки нажатия клавиши и для MATLAB для его обработки. Все вложенные try
- catch
заявления будут сломаны, как я думаю, вам нужно.
killTest.м
function killTest
try
annoyingFunction();
fprintf('Does not run.');
catch ME
fprintf('Fooled again! (%s)\n',ME.message);
end
end
function annoyingFunction()
somethingWrong = true; % more useful code here
if somethingWrong,
% error('annoyingFunction:catchableError','catchable error');
terminateExecution % by Pursuit
% interrupt % by Matt B.
pause(0.1)
end
end
Пример
Вы вернетесь в командную строку непосредственно из подфункции, но это выглядит как программа была прекращена нажатием клавиши:
>> killTest
Operation terminated by user during killTest>annoyingFunction (line 17)
In killTest (line 4)
annoyingFunction();
>>
Если вместо этого вы используете error
(раскомментируйте строку ошибки внутри annoyingFunction
, чтобы проверить), она попадает на catch
s tatement в killTest
:
>> killTest
Fooled again! (catchable error)
Предлагаемые изменения в interrupt
(упрощений, более надежное приобретение команды оконной ручки и читаемость):
function interrupt
import java.awt.event.KeyEvent
import java.lang.reflection.*
base = com.mathworks.mde.cmdwin.CmdWin.getInstance();
hCmd = base.getComponent(0).getViewport().getView();
cmdwin = handle(hCmd,'CallbackProperties');
argSig = javaArray('java.lang.Class',1);
argSig(1) = java.lang.Class.forName('java.awt.event.KeyEvent');
msTime = (8.64e7 * (now - datenum('1970', 'yyyy')));
args = javaArray('java.lang.Object',1);
args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,msTime,...
KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED);
method = cmdwin.getClass().getDeclaredMethod('processKeyEvent',argSig);
method.setAccessible(true);
method.invoke(cmdwin,args);
Примечание: Если все в порядке с набрав что-то, чтобы полностью выйти, просто используйте keyboard
и когда он остановится в командной строке отладки (K>>
), введите dbquit
a d вы вернетесь в командную строку базового рабочего пространства. Симпатичный способ предоставления интерактивного триггера для выполнения dbquit
был предоставлен на MATLAB Central newsreader. Моя версия этого решения:
fprintf('Terminate execution?\n<a href="matlab: dbquit;">Yes</a>/<a href="matlab: dbcont;">No</a>\n');
keyboard
Когда этот бит кода запускается, вы получите немного подсказку, как это:
Terminate execution?
Yes/No
«да» и «Нет» Текст будет интерактивными и будет либо выполните dbquit
или dbcont
.
Это действительно хороший вопрос, но я не думаю, что есть решение, если вы не хотите использовать исключения. –
Ха-ха, я искал больше, как «Это очень простой вопрос». Это странно. Возможно, мне придется полагаться на выход, но пользователь не будет знать, что попало в них, если я не вывешу файл журнала, но это еще не вариант. Благодаря! – theoutlander
Я не совсем понимаю вопрос. Что вы подразумеваете под << остановкой выполнения программы в Matlab без выхода из Matlab >>. Можете ли вы привести пример, скажем, используя мнимую команду? –