wtorek, 20 marca 2012

Logowanie wyjątków do bazy danych

Bardzo często użytkownik zgłasza problem w stylu:
"Panie Sebastianie, wyskoczył błąd i się nie zaksięgowało, proszę o pomoc."
Oczywiście nie ma komunikatu błędu i większość czasu trzeba teraz poświęcić na to co było robione a nie na poprawę mechanizmu/danych.

Dobrym rozwiązaniem jest zapisywanie pewnych wyjątków w bazie danych, aby później można było je przeglądać.
Oczywiście można pisać swoje różne mechanizmy, ale pokażę jak to zrobić bardzo prosto (ale wymagana jest licencja na AIF).
Moduł AIF (Aplication Integration Framework) poza swoją funkcjonalnością udostępnia kilka ciekawych klas.
W tym poście pokażę jak wykorzystać dwie z nich AifInfoLog oraz SysExceptionLog.


Mamy kawałek kodu (w naszym przypadku potwierdzenie listy pobrania) i chcemy zalogować wyjątek jeśli wystąpi:

  
static void SBR_AifInfoLog_Example(Args _args)
{
    AifInfoLog      aifInfoLog;
    SysExceptionLog exceptionLog;
    ;
    aifInfoLog = new AifInfoLog();

    try
    {
        // resetujmy zapamiętane komunikaty
        aifInfoLog.reset();

        // kod który zwraca wyjątek
        WMSOrder::find('00000081_068').finish();
    }
    catch
    {
        // zapisujemy wyjątek do bazy danych
        exceptionLog = new SysExceptionLog();
        exceptionLog.writeInfoLogData('SBR_TEST', aifInfoLog.getInfoLogData());
    }
}

Aby zobaczyć zalogowane wyjątki uruchamiamy menu item \Menu Items\Display\Exceptions i uruchamiamy formatkę gdzie mamy listę przechwyconych wyjątków.