我正在尝试处理我的某些timer
函数(TimerFcn
、、StopFcn
...)中发生的错误。我的问题是我需要处理实际回调之外的错误。但是,以下方法不起作用:
callback = @(~, ~) error('Oops.');
try
t = timer('TimerFcn', callback);
start(t);
catch e
fprintf('Caught exception: %s\n', e.message);
end
输出是:
Error while evaluating TimerFcn for timer 'timer-5'
Oops.
我确实明白为什么上面的代码不起作用(毕竟定时器的想法是异步执行)。但是我还没有找到任何其他正式的方法来实现我的目标(例如,我可以挂钩的全局错误处理程序)。
到目前为止,我发现的唯一解决方法是 shadow error
:
oldError = @error;
errors = {};
error = @(varargin) assignin('base', 'errors', [evalin('base', 'errors'), {varargin}]);
callback = @(~, ~) error('Oops.');
t = timer('TimerFcn', callback);
start(t);
wait(t);
错误现在存储在errors
. 但是,这种做法有很多问题:什么时候恢复原来的error
功能?如何处理定时器函数以外的代码引发的错误?...
因此:如何以干净可靠的方式处理计时器功能中的错误?