我正在尝试处理我的一些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.
我明白为什么上面的代码不起作用(毕竟,定时器的想法是异步执行)。但是我没有找到任何其他官方方法来实现我的目标(例如,我可以挂钩的全局错误处理程序)。
到目前为止,我发现的唯一解决方法是隐藏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
功能?如何处理除定时器函数以外的代码引发的错误? ...
因此:如何以干净可靠的方式处理计时器功能中的错误?
答案 0 :(得分:3)
您应该使用计时器对象的ErrorFcn
属性。
一个简单的例子:
>> tcallback = @(~, ~) error('Oops.');
>> ecallback = @(~, ~) disp('Caught error');
>> t = timer('TimerFcn', tcallback, 'ErrorFcn', ecallback);
>> start(t)
Error while evaluating TimerFcn for timer 'timer-2'
Oops.
Caught error
显然,您可以使错误处理更加健壮,但它会处理timer
错误的异步性质。 ErrorFcn
的输入参数(如果你没有像上面的例子中那样压制它们)提供了有关抛出的错误的信息,因此你可以专门处理它们。