C#如何提取Oracle raise_application_error抛出的纯错误信息
实现方法
Oracle的RAISE_APPLICATION_ERROR抛出的异常消息默认会携带固定格式的前缀ORA-错误码: 和后缀行号信息,你可以通过以下两种方式提取纯自定义错误内容:
方案1:字符串截断处理(性能最优)
直接按照Oracle异常消息的固定结构截取内容,逻辑简单无需额外依赖:
try { // 业务代码 } catch (OracleException ex) { string errorMsg; // 判断是否为自定义应用异常(错误码范围固定为20000~20999) if (ex.Number is >= 20000 and <= 20999) { // 定位第一个冒号位置,跳过前缀`ORA-XXXX: ` int prefixEndIndex = ex.Message.IndexOf(':') + 2; // 定位换行符位置,跳过末尾行号信息 int lineBreakIndex = ex.Message.IndexOf('\n'); errorMsg = lineBreakIndex > prefixEndIndex ? ex.Message.Substring(prefixEndIndex, lineBreakIndex - prefixEndIndex).Trim() : ex.Message.Substring(prefixEndIndex).Trim(); } else { // 非自定义异常保留原错误信息 errorMsg = ex.Message; } MessageBox.Show(errorMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
方案2:正则匹配提取(兼容性最好)
如果自定义消息中可能包含换行符,可以用正则表达式精准匹配内容,需要引入命名空间System.Text.RegularExpressions:
try { // 业务代码 } catch (OracleException ex) { string errorMsg; if (ex.Number is >= 20000 and <= 20999) { var match = Regex.Match(ex.Message, @"^ORA-\d+: (.*?)(\r?\n行 \d+|$)", RegexOptions.Multiline); errorMsg = match.Success ? match.Groups[1].Value.Trim() : ex.Message; } else { errorMsg = ex.Message; } MessageBox.Show(errorMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
注意事项
两种方案都仅对RAISE_APPLICATION_ERROR抛出的自定义异常做特殊处理,系统级Oracle异常会保留原始错误信息,不影响常规报错排查。
内容的提问来源于stack exchange,提问作者Neo4242
相关产品推荐
相关产品推荐

