|
Hello,
I wonder if there is an easy way to know what the ERROR was, which caused a
program to END ABNORMALLY?
I want to create a generic ERROR HANDLING procedure by which I can inform
everybody in the IT deparment about a problem that occurred 1 or multiple
times.
I would like to use the ON-EXIT function to accomplish this.
So when the ON-EXIT tells me that there was an error, I want to store the
Error Message Data in a DB File and send (periodicly) emails to the IT
Department about the errors that occurred and according the severity of the
error.
Can somebody tell me how I can retrieve the error message in the ON-EXIT?
Please find a simple example program about how I would like to structure
this.
Kind regards,
Kris
**FREE
//**************************************************************************
******************
// PROGRAM : Automatic Error Handling TEST
//
----------------------------------------------------------------------------
---------------
// DATE DESCRIPTION
USER TICKETNR
//
----------------------------------------------------------------------------
---------------
// 09/12/20 Creation of the program
JOHN DOE
// ../../.. .......................
.......... ../.....
//**************************************************************************
******************
//---- H-Specs ----
ctl-opt main(main_Procedure);
ctl-opt option(*srcstmt: *nodebugio: *nounref);
ctl-opt datedit(*DMY/);
ctl-opt decedit('0,');
ctl-opt alwnull(*usrctl);
ctl-opt datfmt(*ISO);
ctl-opt timfmt(*ISO);
//--- D(descriptive)-Specs ---
/include QPROTOTYPE,ERRREPORT
dcl-s v_lib char(10) inz('');
dcl-s MyFile char(10) inz('CUSTOMER');
dcl-ds MyFileQual Qualified;
File char(10);
Lib char(10);
end-ds;
dcl-s i_errorOccured ind inz(*off);
//--- ERROR HANDLING datastructure ---
dcl-ds errorHandlingDS;
e_environment char(10); //In which environment did the error
occur
e_program char(30); //In which program did the error
occur
e_library char(10); //In which library did the error
occur
e_module char(10); //In which module did the error
occur
e_procedure char(128); //In which procedure did the error
occur
e_statement packed(7:0); //At which statement dit the error
occur
e_callerPgm char(10); //What was the caller program
e_callerUser char(10); //Who activated the program
e_errorID char(20); //What was the error ID (MCH....)
e_errorSeverity packed(2:0); //What was the error Severity
e_errorType char(20); //What was the error Type
(diagnostic/Escape/...)
e_errorTitle char(128); //What was the error Title
e_errorMessage char(25000); //What was the error Message
e_errorCause char(25000); //What was the error Cause
end-ds;
//--- Program datastructure ---
DCL-DS *n PSDS;
@pgmname char(10) pos(1);
@status *STATUS;
@routine *ROUTINE;
@exceptType char(4) pos(40);
@exceptNr char(3) pos(43);
@pgmLibrary char(10) pos(81);
@exceptData char(80) pos(91);
@job char(10) pos(244);
@user char(10) pos(254);
@jobnr zoned(6 : 0) pos(264);
@srcFile char(10) pos(304);
@srcLibrary char(10) pos(314);
@srcMember char(10) pos(324);
@srcProgram char(10) pos(334);
@srcModule char(10) pos(344);
@jobId char(16) pos(380);
@systemName char(8) pos(396);
END-DS;
//**************************************************************************
*****************
// B E G I N N I N G O F T H E P R O G R A M
//**************************************************************************
*****************
dcl-proc main_Procedure;
dcl-s v_value1 packed(5:0) inz(0);
dcl-s v_value2 packed(5:0) inz(0);
dcl-s v_value3 packed(5:0) inz(0);
clear errorHandlingDS;
e_program = @pgmname;
e_procedure = %proc();
//--- No problem / returnValue = 20 ---
v_value1 = 10;
v_value2 = 10;
v_value3 = makeCalculation(v_value1:v_value2:'+');
//--- MCH1210 (severity 40)
//--- Receiver value too small to hold result ---
v_value1 = 100;
v_value2 = 99999;
//v_value3 = makeCalculation(v_value1:v_value2:'+');
//--- No problem / returnValue = 90 ---
v_value1 = 100;
v_value2 = 10;
v_value3 = makeCalculation(v_value1:v_value2:'-');
//--- No problem / returnValue = -90 ---
v_value1 = 10;
v_value2 = 100;
v_value3 = makeCalculation(v_value1:v_value2:'-');
//--- MCH1210 (severity 40)
//--- Receiver value too small to hold result ---
//v_value3 = (10 - 9999999999);
//--- No problem / returnValue = 100 ---
v_value1 = 10;
v_value2 = 10;
v_value3 = makeCalculation(v_value1:v_value2:'*');
//--- MCH1210 (severity 40)
//--- Receiver value too small to hold result ---
v_value1 = 100;
v_value2 = 99999;
//v_value3 = makeCalculation(v_value1:v_value2:'*');
//--- No problem / returnValue = 10 ---
v_value1 = 100;
v_value2 = 10;
v_value3 = makeCalculation(v_value1:v_value2:'/');
//--- No problem / returnValue = 0 (no comma)---
v_value1 = 10;
v_value2 = 100;
v_value3 = makeCalculation(v_value1:v_value2:'/');
//--- MCH1211 (severity 40)
//--- Attempt made to divide by zero for fixed point operation. ---
v_value1 = 100;
v_value2 = 0;
v_value3 = makeCalculation(v_value1:v_value2:'/');
on-exit i_errorOccured;
if i_errorOccured;
// here I want to know:
// -------------------
// WHICH problem occured (Divide by zero, too small, ...)
// WHICH Error type (escape, ...)
// WHICH severity
// In which procedure it happened
// At which statement
// ...
reportProblem(e_procedure);
endif;
*inlr = *on;
return;
end-proc;
//--------------------------------------------------------------------------
-----------------
// Make a calculation
//--------------------------------------------------------------------------
-----------------
dcl-proc makeCalculation;
dcl-pi makeCalculation packed(5:0);
p_value1 packed(5:0) const;
p_value2 packed(5:0) const;
p_type varchar(1) const;
end-pi;
dcl-s v_returnValue packed(5:0) inz(0);
e_procedure = %proc();
clear v_returnValue;
select;
when (p_type = '+');
v_returnValue = p_value1 + p_value2;
when (p_type = '-');
v_returnValue = p_value1 - p_value2;
when (p_type = '*');
v_returnValue = p_value1 * p_value2;
when (p_type = '/');
v_returnValue = p_value1 / p_value2;
endsl;
return v_returnValue;
end-proc;
//--------------------------------------------------------------------------
-----------------
// Report the problem to the Developers
//--------------------------------------------------------------------------
-----------------
dcl-proc reportProblem;
dcl-pi reportProblem;
p_procedure char(128);
end-pi;
e_program = @pgmname;
e_procedure = %trim(p_procedure);
e_errorTitle = 'SomeThing happened!!';
//Send an email or submit the error data to a file...
saveErrorReport(errorHandlingDS);
end-proc;
--
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.
Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related
questions.
Help support midrange.com by shopping at amazon.com with our affiliate
link: https://amazon.midrange.com
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.