我正在尝试处理在我的一些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函数?如何处理由定时器函数以外的代码引发的错误?
因此:如何以干净可靠的方式处理计时器函数中的错误?
发布于 2013-08-05 12:28:17
您可能应该使用timer对象的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的输入参数(如果不像上面的示例那样抑制它们)提供了有关抛出的错误的信息,因此您可以具体地处理它们。
https://stackoverflow.com/questions/18057352
复制相似问题