From 7ac2565845873a37cadbd48e8a3112df4026e671 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Thu, 16 Oct 2025 15:44:45 +0800 Subject: [PATCH] =?UTF-8?q?IFS=20error=E6=8F=90=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/IfsErrorMessageUtils.java | 74 +++++++++++++------ 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java b/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java index b061827..c64d13e 100644 --- a/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java +++ b/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java @@ -11,7 +11,15 @@ public class IfsErrorMessageUtils { /** * 提取Oracle错误信息中的关键内容 - * 从第一个 "ORA-20110:" 到第一个 ".\r\n" 之间的内容 + * 支持多种Oracle错误类型:ORA-20110、ORA-06502、ORA-01403等 + * + *

支持的错误类型:

+ * * * @param fullErrorMessage 完整的错误信息 * @return 提取后的关键错误信息 @@ -22,44 +30,64 @@ public class IfsErrorMessageUtils { } try { - // 查找第一个 ORA-20110: 的位置 - String oraPattern = "ORA-20110:"; + // 查找第一个 ORA- 错误的位置 + String oraPattern = "ORA-"; int startIndex = fullErrorMessage.indexOf(oraPattern); if (startIndex == -1) { - // 如果没有找到 ORA-20110,尝试查找其他 ORA 错误 - oraPattern = "ORA-"; - startIndex = fullErrorMessage.indexOf(oraPattern); - if (startIndex == -1) { - return fullErrorMessage; // 如果没有找到任何 ORA 错误,返回原始信息 - } + return fullErrorMessage; // 如果没有找到任何 ORA 错误,返回原始信息 } - // 查找第一个 .\r\n 的位置 - String endPattern = ".\\r\\n"; - int endIndex = fullErrorMessage.indexOf(endPattern, startIndex); + // 提取 ORA 错误码(如 ORA-20110, ORA-06502) + String oraErrorCode = ""; + int colonIndex = fullErrorMessage.indexOf(":", startIndex); + if (colonIndex != -1) { + oraErrorCode = fullErrorMessage.substring(startIndex, colonIndex).trim(); + log.debug("检测到Oracle错误类型: {}", oraErrorCode); + } + + // 查找错误信息的结束位置 + // 常见结束标记:.\r\n、\r\n、\n、ORA-(下一个错误) + String[] endPatterns = {".\\r\\n", ".\r\n", "\r\n\r\n", "\nORA-"}; + int endIndex = -1; + + for (String pattern : endPatterns) { + int tempEndIndex = fullErrorMessage.indexOf(pattern, startIndex); + if (tempEndIndex != -1) { + // 对于 .\r\n 和 .\n,不包含句点 + if (pattern.startsWith(".")) { + endIndex = tempEndIndex; + } else if (pattern.equals("\nORA-")) { + endIndex = tempEndIndex; + } else { + endIndex = tempEndIndex; + } + break; + } + } if (endIndex == -1) { - // 如果没有找到 .\r\n,返回原始信息 - return fullErrorMessage; + // 如果没有找到结束标记,取到字符串末尾 + endIndex = fullErrorMessage.length(); } - // 提取错误信息:从 ORA-20110: 开始到第一个 .\r\n 之前(不包含 .\r\n) + // 提取错误信息:从 ORA-xxxxx: 开始到结束位置 String errorMessage = fullErrorMessage.substring(startIndex, endIndex).trim(); - // 去掉 ORA-20110: 前缀,只保留具体的错误内容 - if (errorMessage.startsWith("ORA-20110:")) { - errorMessage = errorMessage.substring("ORA-20110:".length()).trim(); - } else if (errorMessage.startsWith("ORA-")) { - // 处理其他ORA错误,去掉ORA-xxxxx:前缀 - int colonIndex = errorMessage.indexOf(":"); - if (colonIndex != -1) { - errorMessage = errorMessage.substring(colonIndex + 1).trim(); + // 去掉 ORA-xxxxx: 前缀,只保留具体的错误内容 + if (colonIndex != -1 && colonIndex < endIndex) { + String messageContent = fullErrorMessage.substring(colonIndex + 1, endIndex).trim(); + + // 如果去掉前缀后有有效内容,则使用去掉前缀的内容 + if (StringUtils.isNotBlank(messageContent) && messageContent.length() > 5) { + errorMessage = messageContent; + log.debug("提取到错误内容: {}", errorMessage); } } // 如果提取的信息为空或太短,返回原始信息 if (StringUtils.isBlank(errorMessage) || errorMessage.length() < 5) { + log.warn("提取的错误信息过短,返回原始信息"); return fullErrorMessage; }