C#oracle:捕获与连接相关的所有异常?

时间:2013-06-06 12:40:43

标签: c# oracle exception

在c#中,我可以捕获有关(非)连接到Oracle数据库的所有错误吗?

我不想捕获有关编写错误的查询的错误,但只有错误,例如No listener,connection lost ...

如果查询写得不好(或缺少表格),那么这就是我的错。 但是,如果Oracle或网络出现故障,则应由其他部门负责。

6 个答案:

答案 0 :(得分:1)

编写在try catch部分中构建连接的代码:

try
{
   BuildConnection(connectionString);
}
catch (OracleException ex)
{
   //Connectivity Error
}

答案 1 :(得分:1)

此类问题的简单答案是使用Try Catch阻止

try
{
   // your code
}
catch (OracleException ex)
{

}

MSDN HELP

答案 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;
}