在我的存储过程中,我只检查了一个特定的条件,如果该条件失败,我将抛出异常。如下,
Raise Exception '%', 'Hello world';
它工作正常,但错误消息Hello world还附带了一些其他错误代码,如下面的东西,如我的前端,
DA00014:ERROR: P0001: Hello world
|___________________|
|
I really dont want this part to get displayed in the front end.
是否有任何正确的方法可以过滤/从抛出的异常中提取正确的消息。
[注意: 请不要建议我做一些字符串操作。]
DBMS : POSTGRESQL 9.0.3
Driver : Npgsql 1.0
Front End : VB.net
答案 0 :(得分:1)
如果NpgsqlException.Errors
在您的异常处理程序中为空,那么您很可能遇到Npgsql Fastpath中的错误(我认为它仍然是一个错误)。版本2中Here is the offending line但版本1中存在相同的问题。
它基本上归结为这个代码,其中构造了一个正确的NpgsqlError
,然后在通过调用ToString()
来引发异常时抛弃它。
NpgsqlError e = new NpgsqlError(conn.BackendProtocolVersion, stream);
throw new NpgsqlException(e.ToString());
修复程序就像将代码更改为此并使用NpgsqlException
已支持的功能在构造函数中接收NpgsqlError
列表一样简单。
NpgsqlError e = new NpgsqlError(conn.BackendProtocolVersion, stream);
throw new NpgsqlException(new ArrayList(e));
总而言之,如果没有字符串操作,除非编译自己的Npgsql版本修补问题,否则不能这样做。
如果您没有使用Fastpath,则抛出的NpgsqlException
对象包含Errors
属性,该属性应为非空列表。这是从第一个错误中提取消息的示例。
(ex.Errors[0] as NpgsqlError).Message
答案 1 :(得分:0)
Raise Exception '%', '|Hello world';
在前端split your message on character "|",
并显示数组的第二个索引。 e.g
Try
' your code..
Catch ex As Exception
Dim arr As String() = ex.Message.Split("|")
If arr.Count > 1 Then
MessageBox.Show(Convert.ToString(arr(1)))
Else
MessageBox.Show(Convert.ToString(ex.Message))
End If
End Try
答案 2 :(得分:0)
如果我理解,你可以尝试一次
IF condition match -- (your condition)
BEGIN
RAISERROR('Hello world', 16,16)
return
END
和异常
可以像
一样使用catch(exception ex)
{
// ex.Message
// ex.InnerException.Message
}
答案 3 :(得分:0)
这应该有效:
Catch ex As Exception
lblMsg.Text = ex.Message.Replace("ERROR: P0001: ", "")
End Try