在 c# 中,我可以捕获有关(非)连接到 Oracle 数据库的所有错误吗?
我不想捕获有关编写错误的查询的错误,而只想捕获诸如没有侦听器,连接丢失之类的错误...
如果查询写得不好(或表丢失),那么这是我的错。但是,如果 Oracle 或网络出现故障,那么这应该由另一个部门持有。
编写代码,在 try catch 部分中构建连接:
try
{
BuildConnection(connectionString);
}
catch (OracleException ex)
{
//Connectivity Error
}
ORA-12150 到 ORA-12236 之间的错误与连接错误有关。几个例子:
ORA-12154: TNS: 无法解析指定的连接标识符
ORA-12152: TNS: 无法发送中断消息
ORA-12157: TNS: 内部网络通信错误
请参考https://docs.oracle.com/cd/E11882_01/server.112/e17766/net12150.htm
System.Data.SqlClient.SqlException 中仍然会捕获诸如 No listener, connection lost 之类的错误,但是,您可以检查 ErrorCode 和 Errors 以相应地处理不同的情况,例如,不是侦听器或连接丢失等。
MSDN 似乎没有记录所有可能的错误,但是,您可以编写一些单元测试或集成测试来了解 ErrorCode 和 Errors 中出现的内容,然后在生产代码中相应地编写错误处理程序。
OracleException 仅包含错误代码而不包含错误。因此,您可能正在使用 switch(e.ErrorCode) 来处理不同的情况。
当然 - 您可以捕获特定的异常类型,或者如果它们都是相同的异常类型,您可以捕获它,检查它是否是特定类型,然后重新抛出您不想处理的异常类型。没有你的语法,这里有一个例子......
try
{
// your Oracle code
}
catch (OracleException ex)
{
if (ex.Message == "Something you don't want caught")
{
throw;
}
else
{
// handle
}
}
我观察到每次发生网络异常时,都会在内部异常中找到一个SocketException。
我还观察到,当发生网络异常时,第一个内部异常的类型是«OracleInternal.Network.NetworkException»,但不幸的是,这个类是内部的......
基于这些观察,我将编写如下代码:
public void RunQuery()
{
try
{
var con = new OracleConnection("some connection string");
con.Open();
var cmd = con.CreateCommand();
// ...
cmd.ExecuteNonQuery();
}
catch (Exception ex) when (IsNetworkException(ex))
{
// Here, a network exception occurred
}
catch (Exception ex)
{
// Here, an other exception occurred
}
}
private static bool IsNetworkException(Exception ex)
{
var exTmp = ex;
while (exTmp != null)
{
if (exTmp is SocketException)
return true;
exTmp = exTmp.InnerException;
}
return false;
}