You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:54:01