处理 Oracle DB 存储的 Java 类中的异常

Posted

技术标签:

【中文标题】处理 Oracle DB 存储的 Java 类中的异常【英文标题】:Handling exceptions in Oracle DB stored Java classes 【发布时间】:2014-06-26 15:37:23 【问题描述】:

当存储的 Java 类遇到未处理的异常时,将完整堆栈跟踪返回到 PL/SQL 以进行正确日志记录的最佳方法是什么?

在我的课程的初步测试中,我遇到了 NullPointer,Oracle 将其显示为未处理的 Java 异常。我得到的唯一信息是它是一个 NullPointer - 我不知道它在代码中的位置。

显然我应该能够通过严格验证客户端提供的数据和单元测试来避免大多数异常,但万一发生了什么?

我正在考虑捕获异常,将它们的堆栈跟踪存储在一个数组中并将该数组返回给 PLSQL...但我宁愿避免管理所有这些额外的返回值。

肯定已经有一些东西了,不幸的是我的 Google-fu 让我失望了......

【问题讨论】:

你有什么问题? 【参考方案1】:

您可以获得完整的堆栈跟踪并将它们转换为String 并将其传递给PL/SQL 以进行日志记录。我从另一个 SO 问题 here 中得到了将 Stacktrace 转换为 String 的简单解决方案

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
String stackTrace = sw.toString(); // Send it to PL/SQL

【讨论】:

我选择了这个。我将它们创建为静态变量并创建了一个包装函数log(Exception)log(String)(使用pw.append 添加我自己的消息)用于开发/调试,将其发送到 System.out 或这取决于我是否在本地 JVM 或数据库 JVM 上运行它。后来我不得不捕获通过 System.out 完成的外部 API 的调试消息,但我无法访问代码来执行您的建议,所以我不得不使用类似于 ***.com/questions/8708342/… 的东西。 很高兴你能做到。谢谢

以上是关于处理 Oracle DB 存储的 Java 类中的异常的主要内容,如果未能解决你的问题,请参考以下文章

为了对存储在 Oracle db 中的数据运行搜索查询,在 PL/SQL 中使用 REGEXP 是不是比在 Java 正则表达式中获取所有数据并过滤它更快?

处理 DB2 中存储过程或 SQL 中的每一行

将 java.long 映射到 oracle.Number(14)

如何跟踪存储在 Oracle Berkeley DB XML 中的文件的更改

Erlang 中的 Oracle DB 连接处理程序

为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?