2

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ただし、このアプローチには多くの問題があります。元の機能をいつ復元するか。タイマー関数以外のコードで発生したエラーに対処する方法は? ...

したがって、タイマー関数のエラーをクリーンで信頼できる方法で処理するにはどうすればよいですか?

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 に答える