You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex 24.1.7:PL/SQL异常调试日志被自定义错误覆盖如何解决

问题原因

APEX_DEBUG_MESSAGE的日志默认存储在内存缓冲中,只有当PL/SQL块正常执行完成(事务提交)或显式调用刷新方法时,才会将缓冲内容写入到调试日志表。而raise_application_error会直接抛出异常终止代码执行,同时触发事务回滚,导致缓冲中未持久化的调试日志被清空,最终只显示抛出的应用错误信息。

解决方案

针对这个问题,有两种可靠的处理方式:

方案1:显式刷新调试日志

在抛出应用错误前,调用apex_debug_message.flush_messages强制将缓冲中的日志写入到存储表,避免回滚丢失:

EXCEPTION
    when others then
        -- 记录原始错误详情
        apex_debug_message.log_message(
            p_message => 'Unidentified error: ' || sqlerrm || ': ' || dbms_utility.format_error_backtrace, 
            p_level   => 1
        );
        -- 强制刷新日志到存储表(关键步骤)
        apex_debug_message.flush_messages;
        -- 抛出用户友好错误
        raise_application_error(-20001, 'An unidentified error occurred. Please contact Support.');   
END;

方案2:使用APEX_ERROR.ADD_ERROR替代RAISE_APPLICATION_ERROR

apex_error.add_error不会立即终止代码执行,也不会触发事务回滚,调试日志会自然完成持久化。如果需要终止后续逻辑,可以在添加错误后手动抛出异常:

EXCEPTION
    when others then
        -- 记录原始错误详情
        apex_debug_message.log_message(
            p_message => 'Unidentified error: ' || sqlerrm || ': ' || dbms_utility.format_error_backtrace, 
            p_level   => 1
        );
        -- 添加用户友好错误提示(会在页面通知区域显示)
        apex_error.add_error(
            p_message          => 'An unidentified error occurred. Please contact Support.',
            p_display_location => apex_error.c_inline_in_notification
        );
        -- 可选:终止后续代码执行
        raise;
END;
额外注意事项
  • 确保应用已开启调试模式:运行应用时添加URL参数&p_debug=YES,或在应用构建器的「调试」菜单中启用调试。
  • 确认调试级别匹配:如果使用p_level=1,需确保当前会话的调试级别不低于该值,可以通过apex_debug_message.set_debug_level(p_level => 1);显式设置。

内容的提问来源于stack exchange,提问作者LogicallyFunky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:38:20