Двухсторонняя трассировка стека Java в ошибках Matlab - PullRequest
2 голосов
/ 27 августа 2009

В 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 разделителей строк, чтобы он отображался через один интервал в командном окне?

Ответы [ 3 ]

1 голос
/ 28 августа 2009

Когда среда выполнения MATLAB перехватывает исключение java, она использует системные окончания строк, когда оборачивает их в MException. Чтобы обойти это, вы можете сгенерировать исключение в другом потоке или отправить трассировку стека непосредственно в stderr, например, с помощью printStackTrace ():

public class Bummer {
 public static void a() { b(); }
 public static void b() { c(); }
 public static void c() { d(); }
 public static void d() { new RuntimeException("bummer").printStackTrace(); }
}

Конечно, очень плохо получить исключение java в MATLAB. Если вы используете исключения для вещей, которые на самом деле не являются исключительными, то вы можете рассмотреть возможность использования MException, которое ваши пользователи сочтут полезным.

Если вы используете исключения для отладки вашего Java-кода, я считаю, что функции анализа трассировки стека большинства Java-IDE способны прекрасно справляться с дополнительными переносами строк.

1 голос
/ 28 сентября 2012

Попробуйте установить:

java.lang.System.setProperty('line.separator', sprintf('\n'));
0 голосов
/ 27 августа 2009

Улучшает ли отображение команда FORMAT вообще? Это помогает отображать переменные в более компактной форме:

format compact

Может также помочь отображать сообщения об ошибках в более компактной форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...