从异常中提取用户定义的错误消息

Raj*_*amy 7 sql postgresql

在我的存储过程中,我只检查了一个特定的条件,如果该条件失败,我将抛出异常.如下,

Raise Exception '%', 'Hello world';
Run Code Online (Sandbox Code Playgroud)

它工作正常,但错误消息Hello world还附带了一些其他错误代码,如下面的东西,在我的前端,

DA00014:ERROR: P0001: Hello world
|___________________|
        |
      I really dont want this part to get displayed in the front end.
Run Code Online (Sandbox Code Playgroud)

有没有适当的方法来过滤/从抛出的异常中提取正确的消息.

[ 注意: 请不要建议我做一些字符串操作.]

DBMS      : POSTGRESQL 9.0.3
Driver    : Npgsql 1.0
Front End : VB.net
Run Code Online (Sandbox Code Playgroud)

Dav*_*wen 1

Npgsql 快速路径

如果NpgsqlException.Errors异常处理程序中为 null,那么您很可能遇到了 Npgsql Fastpath 中的错误(无论如何,我认为它是一个错误)。这是版本 2 中的违规行,但版本 1 中也存在同样的问题。

它基本上可以归结为这段代码,其中NpgsqlError构造了正确的代码,然后在通过调用它引发异常时将其丢弃ToString()

NpgsqlError e = new NpgsqlError(conn.BackendProtocolVersion, stream);
throw new NpgsqlException(e.ToString());
Run Code Online (Sandbox Code Playgroud)

修复方法非常简单,只需将代码更改为此并使用已经支持的在构造函数中NpgsqlException获取列表的功能即可。NpgsqlError

NpgsqlError e = new NpgsqlError(conn.BackendProtocolVersion, stream);
throw new NpgsqlException(new ArrayList(e));
Run Code Online (Sandbox Code Playgroud)

因此总而言之,除非您编译自己的 Npgsql 版本来修补问题,否则您无法在没有字符串操作的情况下完成此操作。

NpgSQL

如果您不使用 Fastpath,则抛出的NpgsqlException对象包含一个Errors应该是非空列表的属性。这是从第一个错误中提取消息的示例。

(ex.Errors[0] as NpgsqlError).Message
Run Code Online (Sandbox Code Playgroud)