Exception handling catch standard infolog / error and write to a log table
Here we will see, how we can capture the standard errors / info and write them to any table.let's create a class which extends runbase and add the all the required methods like Main, Run, etc.
in Run method, we use the Try and catch section, there we will call the method which will return a string as the info / error list.
public class MKSupplierInvoices extends RunBaseBatch
{
public static void main(Args _args)
{
MKSupplierInvoices supplierInvoice = MKSupplierInvoices::construct();
supplierInvoice.caption();
supplierInvoice.initQuery();
if (supplierInvoice.prompt())
{
supplierInvoice.run();
}
}
public void run()
{
VendTrans vendTrans;
try
{
//Logic
}
catch (Exception::Error)
{
ttsBegin;
errorInvoiceTable.selectForUpdate(true);
errorInvoiceTable.PostingStatus = PostingStatus::Error;
errorInvoiceTable.ErrorText = this.captureInfoMessage();
errorInvoiceTable.update();
ttsCommit;
}
catch (Exception::Deadlock)
{
retry;
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel() != 0)
{
throw Exception::UpdateConflict;
}
if (xSession::currentRetryCount() >= #RetryNum)
{
throw Exception::UpdateConflictNotRecovered;
}
retry;
}
catch
{
info(infolog.text());
}
}
public str captureInfoMessage()
{
SysInfologEnumerator sysInfologEnumerator;
SysInfologMessageStruct infoMessageStruct;
ErrorMsg logMessage;
str logString;
str ret;
int i;
#Define.NewLine('\n')
sysInfologEnumerator = SysInfologEnumerator::newData(infolog.infologData());
while (sysInfologEnumerator.moveNext())
{
i = 1;
if (logMessage)
{
logMessage += #Newline;
}
infoMessageStruct = SysInfologMessageStruct::construct(sysInfologEnumerator.currentMessage());
while (i <= infoMessageStruct.prefixDepth())
{
logString = logString + infoMessageStruct.preFixTextElement(i) + '. ';
i++;
}
logString = logString + infoMessageStruct.message();
logMessage = logMessage + infoMessageStruct.message();
}
ret = logMessage;
return ret;
}
}