Matlab 计时器功能的错误处理

Matlab 计时器功能的错误处理,matlab,error-handling,timer,Matlab,Error Handling,Timer,我正在尝试处理某些函数中出现的错误(TimerFcn,StopFcn,…)。我的问题是,我需要处理实际回调之外的错误。但是,以下情况不起作用: 输出为: Error while evaluating TimerFcn for timer 'timer-5' Oops. 我确实理解为什么上面的代码不起作用(毕竟,计时器的思想是异步执行)。然而,我还没有找到任何其他官方方法来实现我的目标(例如,我可以挂接的全局错误处理程序) 到目前为止,我找到的唯一解决方法是对错误进行阴影处理: oldErr

我正在尝试处理某些函数中出现的错误(
TimerFcn
StopFcn
,…)。我的问题是,我需要处理实际回调之外的错误。但是,以下情况不起作用:

输出为:

Error while evaluating TimerFcn for timer 'timer-5' 

Oops.
我确实理解为什么上面的代码不起作用(毕竟,计时器的思想是异步执行)。然而,我还没有找到任何其他官方方法来实现我的目标(例如,我可以挂接的全局错误处理程序)

到目前为止,我找到的唯一解决方法是对错误进行阴影处理:

oldError = @error;
errors = {};
error =  @(varargin) assignin('base', 'errors', [evalin('base', 'errors'), {varargin}]);
callback = @(~, ~) error('Oops.');
t = timer('TimerFcn', callback);
start(t);
wait(t);
错误现在存储在
errors
中。然而,这种方法有很多问题:何时恢复原始的
错误
功能?如何处理由计时器函数以外的代码引起的错误


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

您可能应该使用计时器对象的
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

显然,您可以使错误处理更加健壮,但它可以处理
计时器
错误的异步性质。
ErrorFcn
的输入参数(如果您没有像上面的示例那样抑制它们)提供有关抛出错误的信息,因此您可以专门处理它们。

这似乎不适用于计时器的
StopFcn
中抛出的错误。我需要处理任何计时器回调中的错误(最好是在
ErrorFcn
中)。有什么想法吗?此外,错误仍然显示。这是不可接受的,因为它会让用户认为存在问题。我不确定您在捕获由
StopFcn
抛出的错误时遇到了什么困难-它适合我。我不相信有一种文档化的方法可以禁止显示错误消息,但是如果您愿意编辑MATLAB源代码,您可以注释掉
toolbox\MATLAB\iofun\@timer\timercb.m
中的第42-45行,这就是显示错误的原因。为了避免编辑源代码,只需稍加修改,您就可以创建自己的计时器类,使其重载
timercb
,但当
timercb
调用私有函数时,这可能是一件痛苦的事情。您是对的,
StopFcn
的问题在我这方面是一个错误。无法编辑源代码(代码将发送给客户)。感谢您提出的重载
timercb
的想法,这可能会奏效。
>> 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