Browse Source

IFS error提取

master
han\hanst 3 months ago
parent
commit
7ac2565845
  1. 74
      src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java

74
src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java

@ -11,7 +11,15 @@ public class IfsErrorMessageUtils {
/**
* 提取Oracle错误信息中的关键内容
* 从第一个 "ORA-20110:" 到第一个 ".\r\n" 之间的内容
* 支持多种Oracle错误类型ORA-20110ORA-06502ORA-01403等
*
* <p><b>支持的错误类型</b></p>
* <ul>
* <li>ORA-20110: 应用程序自定义错误</li>
* <li>ORA-06502: 数值或值错误</li>
* <li>ORA-01403: 未找到数据</li>
* <li>其他 ORA-xxxxx 类型错误</li>
* </ul>
*
* @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\nORA-下一个错误
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;
}

Loading…
Cancel
Save