计时器功能的错误处理

时间:2013-08-05 11:45:50

标签: matlab error-handling timer

我正在尝试处理我的一些timer函数(TimerFcnStopFcn,...)中出现的错误。我的问题是我需要处理实际回调的错误。但是,以下工作:

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功能?如何处理除定时器函数以外的代码引发的错误? ...

因此:如何以干净可靠的方式处理计时器功能中的错误?

1 个答案:

答案 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的输入参数(如果你没有像上面的例子中那样压制它们)提供了有关抛出的错误的信息,因此你可以专门处理它们。