В Matlab, когда исключение Java выдается методом Java, вызванным из M-кода, оно преобразуется в ошибку Matlab или MException, и трассировка стека Java включается в сообщение MException. В Windows трассировка стека отображается с двойным интервалом. Вот пример.
package test;
public class Bummer {
public static void a() { b(); }
public static void b() { c(); }
public static void c() { d(); }
public static void d() { throw new RuntimeException("bummer"); }
}
Который производит это.
>> test.Bummer.a()
??? Java exception occurred:
java.lang.RuntimeException: bummer
at test.Bummer.d(Bummer.java:8)
at test.Bummer.c(Bummer.java:7)
at test.Bummer.b(Bummer.java:6)
at test.Bummer.a(Bummer.java:5)
>> disp(find(lasterr == sprintf('\r')))
61 95 129 163 197
Это ухудшает читабельность, особенно когда у вас стек глубиной в двадцать вызовов.
Я полагаю, что это связано с тем, что часть сообщения об ошибке в стековой трассировке строится с окончанием строки CRLF (\ r \ n) в режиме DOS. Что имеет смысл на машине с Windows. Но командное окно Matlab является своего рода режимом Unix и преобразует \ r \ n в два перевода строки.
Наш текущий обходной путь - использовать защитный код try / catch, как это, для большинства вызовов методов Java.
try
somejavaobject.SomeMethod();
catch err
rethrowmsg(err, 'Some additional details');
end
Rethrowmsg () - это функция, которую мы написали, которая использует err для преобразования \ r \ n в \ n, включает в сообщение дополнительные детали и затем вызывает RETHROW.
Добавление обходного пути немного утомительно и может быть обойдено. И если вы делаете «dbstop if all error», это не исправит отображение ошибки в этой точке. В конце концов, это незначительное раздражение, но когда вы весь день отлаживаете отладку кода Matlab, он складывается. И мне любопытно, что такое механизм интеграции исключений Java / MException.
Есть ли способ настроить Matlab для построения части трассировки стека текста сообщения об ошибке с помощью \ n разделителей строк, чтобы он отображался через один интервал в командном окне?