How to "dbup" to ORIGINAL error after try/catch and rethrow?

6 次查看(过去 30 天)
Hi,
When I debug my code, I use "dbstop if error" to inspect the workspace of the function that created an error.
Now, if an error is caught in a try/catch statement and then rethrown, the "dbstop if error" brings me to the workspace of the catch block in which the rethrow happened. From there, I would like to have a way to get back to the workspace in which the original, caught error happened.
Googling suggests that there is no solution (<http://stackoverflow.com/questions/10429229/debugging-back-to-original-error-with-conditional-exception-handling-i-e-rethr here>) but I want to ask here, too. This is a hugely annoying problem and if MathWorks has not addressed it yet, I definitely hope they will do so soon.
If this is indeed impossible, how do I best deal with such a situation? In my case, I need the try/catch to execute some "cleanup" code after an error before Matlab enters debug mode because my error-causing code has control of the keyboard and screen and I cannot use the computer while it is being executed.

回答(3 个)

Jan
Jan 2014-1-4
编辑:Jan 2014-1-5
Would this help:
dbstop if all error
?
[EDITED, Thanks Per] In modern Matlab versions this is called:
dbstop if caught error
The former syntax seems to be supported for backward compatibility.
  4 个评论
Matthias
Matthias 2014-1-5
编辑:per isakson 2021-8-22
Unfortunately, dbstop if caught error doesn't help, for two reasons:
1. Any function that makes use of exceptions (handled with try/catch) will now throw errors, not just the one I want to debug. Since I am using third-party code that does this, I cannot reasonably use dbstop if caught error.
2. Dbstop if caught error enters debug mode BEFORE executing the code in the catch block. This makes sense, but in my case, the code in the catch block must be executed to give control of the screen and keyboard back to the user (my code blocks user input during execution).
PS: I'm looking for a general solution that's useful for debugging, not a solution for a specific error-type.
per isakson
per isakson 2014-1-6
编辑:per isakson 2014-1-6
Overloading error with a sub-function in the m-file (see my answer) is a "general solution". Yes indeed, it smells and it requires write permissions to the m-files, but until The MathWorks (or someone else) provides something better.

请先登录,再进行评论。


per isakson
per isakson 2014-1-5
编辑:per isakson 2014-1-6
"This is a hugely annoying problem". Yes indeed!
I have a hard time to figure out how dbstop if caught error error_id is supposed to be used. This is the best I can think of:
  • set dbstop if error and dbstop if caught error error_id
  • run test_excc
  • Matlab breaks at line 25 sub_test()
  • select sub_test() % Step In doesn't work here(?)
  • right click and Run Selected
  • Matlab breaks at line 39 error('test:error', 'Noooo!');
and the workspace of sub_sub_test() is available for inspection and debugging, i.e. "the ORIGINAL error". Why doesn't Matlab go directly and break at error('test:error', 'Noooo!'); in sub_sub_test() when I run test_excc?
My command window:
>> dbclear all
>> dbstop if error
>> dbstop if caught error test:error
>> test_excc
Caught-error breakpoint was hit in test_excc at line 25. The error was:
Error using test_excc>sub_sub_test (line 39)
Noooo!
25 sub_test()
K>> sub_test
Error using test_excc>sub_sub_test (line 39)
Noooo!
Error in test_excc>sub_test (line 35)
sub_sub_test();
39 error('test:error', 'Noooo!');
K>>
where (in one m-file) is copied from your link to stackoverflow
function test_excc
% doc says:
% dbstop if error MATLAB:ls:InputsMustBeStrings pauses execution at
% the first run-time error outside a try/catch block that has a
% message ID of MATLAB:ls:InputsMustBeStrings.
%
% dbstop if caught error — Run-time error that occurs within the
% try portion of a try/catch block. If you want execution to stop
% only if a specific error occurs, specify the message id. See the
% error condition for an example of specifying a message id.
%
% (12) DBSTOP if caught error
% (16) DBSTOP if caught error IDENTIFIER
try
sub_test()
catch ME
if strcmp(ME.identifier, 'test:notsobad')
fprintf(1, 'Fine\n');
else
ME.rethrow();
end
end
end
function sub_test
sub_sub_test();
end
function sub_sub_test()
if rand>0.5
error('test:error', 'Noooo!');
else
error('test:notsobad', 'That''OK');
end
end
.
[Two hours later:]
Not for faint-hearted!
  • Overload the function error temporarily, see below.
  • run test_excc
  • Matlab breaks in the overloaded function, error
  • Step Out takes you to "the ORIGINAL error"
and the workspace of sub_sub_test() is available for inspection and debugging.
My command window:
>> dbclear all
>> test_excc
3 end
K>>
where
function error( varargin )
dbs
end
and
function dbs
% dbs provides a persistent break-point; debug, dbstop
% Based on the FEX contribution kdb
% By Romesh Abeysuriya 15-11-12
stk = dbstack('-completenames');
dbstop( 'in', stk(2).file, 'at', num2str( stk(2).line+1 ) )
pause(0.2)
end
and don't forget to delete the file, error.m
... or maybe better, add the function error as a sub-function to the file that you are debugging.

Steven Lord
Steven Lord 2021-8-22
编辑:Steven Lord 2021-8-22
Set a breakpoint inside the catch section of the try / catch block. If you only want to enter debug mode when certain errors are thrown and caught, set a conditional breakpoint that stops only if the identifier field of the MException object you caught matches the one you want to debug.
try
x = ones(3) + ones(4);
catch ME
fprintf("The error with identifier '%s'\nand message '%s' was thrown.", ...
ME.identifier, ME.message)
% or you could use if
if isequal(ME.identifier, 'MATLAB:sizeDimensionsMustMatch')
fprintf("You're trying to add arrays with incompatible dimensions.")
end
end
The error with identifier 'MATLAB:sizeDimensionsMustMatch' and message 'Arrays have incompatible sizes for this operation.' was thrown.
You're trying to add arrays with incompatible dimensions.

类别

Help CenterFile Exchange 中查找有关 Debugging and Analysis 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by