OK, now what? |
In this case I thought it was time for a little upgrade.
I noticed the sample code, now part of the APEX_ERROR documentation, suggested including a reference ID, perhaps from some logging package.
Conveniently, we use such a package, a popular one among the PL/SQL community called Logger.
I glanced through the package specification, and for a moment I thought it was missing a function that returned the new log ID.
I found a procedure with an OUT parameter instead, so here I log some contextual information about the error.
logger_user.logger.ins_logger_logs( p_unit_name => 'error_handler' , p_scope => 'apx_util.error_handler' , p_logger_level => logger.g_error, p_extra => p_error.component.name ||'~'||p_error.component.type ||'~'||p_error.message, p_text => 'apx_util.error_handler()', p_call_stack => dbms_utility.format_call_stack, p_line_no => null, po_id => l_reference_id );Now the user has some context to report. I figured the wording could be softened a little, too ;p
Standard error message, with reference |
So if we were to execute the following SQL, we could see further details.
select time_stamp, module, client_identifier, extra from logger_user.logger_logs where id = 12292314;The log message prior to this ID may also help to provide clues as to the problem.
SQL results, slightly redacted |
I also wanted to add some convenience to the developer, so I added this same information to the error popup, but only when an active session is also present within the App Builder (or some special privilege present).
Immediate context for the developer |
This is toggled by checking a built in substitution string (or my application item). I note this built-in was only documented from 18.1, but I believe it has been present for a while. It's certainly returns a value in 5.1.
l_result.message := 'We had a problem completing this request. '|| 'Please contact IT Support'|| ' for further investigation. Reference: '||l_reference_id ||case when v('F_SEC_DEV') = 'Y' -- anyone with privilege -- or has builder open (from oos_util_apex.is_developer) or coalesce(apex_application.g_edit_cookie_session_id ,v('APP_BUILDER_SESSION')) is not null then ' Dev only: '||p_error.component.name ||' ~ '||p_error.component.type ||' ~ '||p_error.message end;This brightened the day of some of my colleagues.
No comments:
Post a Comment