2

我正在尝试处理我的某些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功能?如何处理定时器函数以外的代码引发的错误?...

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

4

1 回答 1

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(如果您没有像上面的示例中那样抑制它们)提供有关所引发错误的信息,因此您可以专门处理它们。

于 2013-08-05T12:28:17.653 回答