在c#中,我可以捕获有关(非)连接到Oracle数据库的所有错误吗?
我不想捕获有关编写错误的查询的错误,但只有错误,例如No listener,connection lost ...
如果查询写得不好(或缺少表格),那么这就是我的错。 但是,如果Oracle或网络出现故障,则应由其他部门负责。
答案 0 :(得分:1)
编写在try catch部分中构建连接的代码:
try
{
BuildConnection(connectionString);
}
catch (OracleException ex)
{
//Connectivity Error
}
答案 1 :(得分:1)
答案 2 :(得分:1)
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
答案 3 :(得分:0)
当然 - 您可以捕获特定的异常类型,或者如果它们都是相同的异常类型,您可以捕获它,检查它是否是特定类型,并重新抛出您不想处理的类型。没有你的语法,这是一个例子......
try
{
// your Oracle code
}
catch (OracleException ex)
{
if (ex.Message == "Something you don't want caught")
{
throw;
}
else
{
// handle
}
}
答案 4 :(得分:0)
错误如No listener,连接丢失仍然在System.Data.SqlClient.SqlException中被捕获,但是,您可以检查ErrorCode和Errors以相应地处理不同的情况,例如,不是侦听器或连接丢失等。
MSDN似乎没有记录所有可能的错误,但是,您可以编写一些单元测试或集成测试来了解ErrorCode和Errors中出现的内容,然后相应地在生产代码中编写错误处理程序。OracleException仅包含ErrorCode而不是错误。所以你可能正在使用switch(e.ErrorCode)来处理不同的情况。
答案 5 :(得分:0)
我观察到每次发生网络异常时,都可以在内部异常中找到一个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;
}