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.
0 个评论
回答(3 个)
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 个评论
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
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.
0 个评论
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
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Debugging and Analysis 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!