|
|
|
@ -11,7 +11,15 @@ public class IfsErrorMessageUtils { |
|
|
|
|
|
|
|
/** |
|
|
|
* 提取Oracle错误信息中的关键内容 |
|
|
|
* 从第一个 "ORA-20110:" 到第一个 ".\r\n" 之间的内容 |
|
|
|
* 支持多种Oracle错误类型:ORA-20110、ORA-06502、ORA-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 错误,返回原始信息 |
|
|
|
} |
|
|
|
|
|
|
|
// 提取 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 的位置 |
|
|
|
String endPattern = ".\\r\\n"; |
|
|
|
int endIndex = fullErrorMessage.indexOf(endPattern, startIndex); |
|
|
|
// 查找错误信息的结束位置 |
|
|
|
// 常见结束标记:.\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; |
|
|
|
} |
|
|
|
|
|
|
|
|