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