Всё по отладке Java-кода в Lotus

  • Автор темы Dymytry
  • Дата начала
N

nvyush

Для LS2J можно использовать подобную обработку ошибок:
Visual Basic:
Function SomeFunction(param As String) As String
    'запрос к web-сервису
    On Error Goto ErrorHandler
    On Error 318 Goto Error318

    Dim jSession As JavaSession
    Dim jClass As JavaClass
    Dim jMethod As JavaMethod
    Dim jError As JavaError
    Dim jErrorStackTrace As String

    Set jSession = New JavaSession()
    Set jClass = jSession.GetClass("SomePackage/SomeClass")
    Set jMethod = jClass.GetMethod("SomeMethod", "(Ljava/lang/String;)Ljava/lang/String;")
    SomeFunction = jMethod.Invoke(, param)
    Exit Function
Error318:
    Set jError = jSession.getLastJavaError()
    jErrorStackTrace = jError.StackTrace
    Call jSession.ClearJavaError()
ErrorHandler:
    msgbox Error + chr$(10) + jErrorStackTrace + chr$(10) + "line: " + cstr(erl)
End Function
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
nvy
Это вариация моего/lmike'вского кода, но всё это не приближает к тому, чтобы выводить пользователю реальную ошибку (та, что в Java-консоли пишется). Наверное
Код:
System.err.println("...");
выводится только в консоль, а не возвращается в jError.errorMsg (оно у меня пустое).
Так вот я это сейчас и пытаюсь понять: как вернуть текст (хотя бы!) ошибки в LS-код из Java-кода.
 
N

nvyush

А если в Ява-коде убрать из обработчика
C++:
System.err.println("...");
оставить только
C++:
e.printStackTrace();

Плюс в вызываемых функциях не использовать try-catch, а объявлять их throws SomeException или в catch пробрасывать исключение дальше в вызывающую функцию.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
если оттавать стэктрэйс - оно почти и вернётся

es = ErrorHandler..RaiseError() - это вызов обработчика базового класса ошибок - обычных ЛС
просто я делаю потом родительским, для LS2J - этот класс, ну а базовый выглядит аналогично:
Visual Basic:
Class ErrorHandler

    Sub ClrError()
    End Sub

    Sub New()
        Call Me.ClrError()
    End Sub
    
    Function GetModuleInfo() As String
        Dim thisType As String, modInfo As String   
        thisType = Typename(Me)
        'Not a class, use the calling module instead
        If (Len(thisType) = 0) Then thisType = Getthreadinfo(11)
        modInfo = thisType + "::" & Getthreadinfo(10) & ": "
        GetModuleInfo = modInfo
    End Function
    
    Function RaiseError() As String
        Dim es As String
        es = GetModuleInfo()
        If (Err = 0) Then
            es = es + "Manually raised an error"
        Else
            es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: " + Trim(Str(Erl))
        End If
        Print es
        Me.RaiseError = es
        Call Me.ClrError()
    End Function
    
End Class
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
lmike
стэктрэйс возвращает кучу хламотни, не хочется пользователей пугать.

nvy
Сделал (начало было здесь)
Java:
import java.io.*;
import java.net.*;

class FileDownloader {

    public static boolean start(String sURL, String sFilePath) throws MalformedURLException, FileNotFoundException, IOException {
        URL u = new URL(sURL);
        InputStream is = u.openStream();
        BufferedInputStream bis = new BufferedInputStream(is);

        int bufSize = 1024;
        byte[] buffer = new byte[bufSize];

        FileOutputStream fos = new FileOutputStream(sFilePath);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        int bytes;
        while ((bytes = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, bytes);
        }
        fos.flush();
        fos.close();

        return true;
    }
}
Естественно смысл As Boolean при таком подходе пропадает. Теперь сообщение об ошибке возвращается, но это не совсем то, что хотелось бы. А хотелось бы:
- генерировать тексты ошибок самостоятельно в Java-либе и нормально получать их оттуда (добавлять из-за этого специальное свойство и читать его потом из LS не хотелось бы);
- получать номер строки в Java-коде, на которой было сгенерировано исключение.
Это возможно?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
дык верхняя строка стэктрэйса и есть ошибка в строке её вызвавшей (с номером строки)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Во "всём том тексте" участвуют 37, 60, 611.
37 - это строка кэтча (я и так могу посмотреть на какой строке у меня обработчик, что это даёт?), но не того места, где была сгенерирована ошибка, что собственно и нужно.
60, 611 - мимо кассы, - в коде всего 53 строки.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
если поставить обработчик в java коде (а не throws ) то и будет "нормальная" строка
и catch блоки можно ставить на разные эксепшены...

да и ваще про эксепшены
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
ну и - чё можно брать из стэктрэйса -
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
Да, и отлаживать Java-код в Лотусе - это извращение..
это известный факт :(
И пока непонятно, как сделать так, чтобы не передёргивать клиента при каждом изменении..
в 7-ке не наблюдал подобного (в 8-ке не разрабатывал именно джава-агенты)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
кстати о птичках...
передергивать клиента не пришлось (я про 8-ку), спокойно менять проект и его пересохранять (у мя нормально получалось)
и в св-ва проект, для определения строки ошибки, надо указывать - Compile Java code with debugging information
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
и в св-ва проект, для определения строки ошибки, надо указывать - Compile Java code with debugging information
Я так понял, что это галка в свойствах элемента дизайна Java-библиотеки.
Эта галка ещё на что-нибудь влияет?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Кто-нибудь настраивал/использовал дебаг в Дизайнере для Java? На панели инструментов есть разворачивающаяся пиктограмма с жуком, а также в окне редактирования кода можно ставить точки останова.
Интересно, можно ли реально это использовать?
 
30.06.2006
141
5
BIT
0
VladSh,

конечно, порядок действий примерно такой же как в сообщении Kee_Keekkenen:
https://codeby.net/threads/34262.html?vi...st&p=161493

1. закрываешь Lotus и добавляешь в notes.ini

JavaEnableDebug=1
JavaDebugClientForeground=1
JavaDebugClientForegroundPort=8701

Последние 2 параметра можно включить через интерфейс (Designer, меню Tools -> Java Debugging Preferences), но тогда надо сначала запустить дизайнер, включить настройку и потом заново перезапустить дизайнер.

2. запускаешь Designer, в свойствах Java агента устанавливаешь галку "Compile Java code with debugging information", сохраняешь.

3. переключаешься на представление Java (меню Window -> Open Perspective -> Java)

4. создаешь Debug Configuration (меню Run -> Debug Configurations), выбираешь Remove Java Application, нажимаешь на иконку сверху "New launch configuration", указываешь порт 8701 (или какой ты ранее указал в notes.ini или через Designer'а).

5. в агенте ставишь где тебе надо breakpoint и запускаешь

Если все нормально, то дизайнер предложит переключиться на представление Debug. Если ничего не произойдет, то попробуй перезапустить дизайнер и сразу после запуска запустить отладочную консоль Javа (меню Tools -> Show Java Debug Console) и уже после этого открывай базу, агента и делай Debug Configuration и запускай.

Добавлено

Когда после запуска дизайнера первым делом включаешь консоль Java, то дизайнеру часто сносит крышу и он начинает находить ненастоящие ошибки (например, ругаться на агенты, использующие LS2J). Чтобы проверить достаточно перезапустить дизайнер и не запуская Java консоль открыть базу и сделать Refresh (правая кнопка на базе -> Refresh).
 
  • Нравится
Реакции: magistr
K

Kee_Keekkenen

проще, конечно, всю java разработку вести во внешней среде и в ней отлаживать, даже можно кансомерс сервисы использовать что с лотусе лежат, погемороившись слегка..
логировать все можно через sl4j, например, написав свой аппендер чтоб в базу логировал..
сейчас как раз логирование очень спасает после загрузки гига данных из сама 40 гигов логов в пачке баз, очень легко и быстро находятся ошибки в коде и в данных.. конечно, эффективнее было бы в реляционку логи писать а не в лотусовые базы, т.к. при больших загрузках при детальном логировании в лотусе на создание документов выстраивается длинная очередь документов, достигала порядка 2-ч часов в отставании от произошедшего события и фактического соранения события в документ..

да и искать в лотусовых базах не так скоро, есть лог на 14 гигов и очень не скоро даже сканезом можно найти ту или иную инфу..
 
30.06.2006
141
5
BIT
0
В принципе вести Java разработку во внешней среде это не только проще, но и лучше.

Например, можно писать на Java используя последней Eclipse и тестировать работу кода оттуда же (соединяясь с серверами Domino через DIIOP).

Основная выгода в том, что можно использовать более новые версии Eclipse (или что кому удобнее, например, IDEA), для которых есть куча различных расширений (Designer работает на старом Eclipse 3.4.2). Да и отладка работает быстрее, т.к. используется локальная JVM.


P.S.
Кстати, кто-нибудь использовал Clover ( )? Как оно?
 
K

Kee_Keekkenen

да, верно.. я вот тоже на джаву потихоньку перехожу, использую связку Idea+svn+maven..
покрытие кода тестами через мавен неплохо работает..
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
я всегда отлаживал во внешней среде, нотус дизигнер ужасен был, а теперь еще и виндовзонли
сейчас добавились сложности в 32бит сборкой (по 64бит) в линухах (подключение LDN классов стало ацким шаманством)
вощем делаю все что можно снаружи и только потом сопрягаю с нотусёвыми сучностями
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!